Changeset 24304


Ignore:
Timestamp:
10/14/13 15:33:40 (9 years ago)
Author:
nit
Message:

[titan] fix segfault

File:
1 edited

Legend:

Unmodified
Added
Removed
  • titan/titan/sock.h

    r24302 r24304  
    587587unsigned long getchunkedlen(int sock, int timeout)
    588588{
    589 printf("1111111111\n");
    590589        unsigned long len = 0;
    591590        int ret = 0;
     
    603602                        break;
    604603                }
    605 printf("222222222\n");
    606604                if(c == ';') break;
    607605
    608606                chunked[chunkedid] = c;
    609 printf("333333333\n");
    610607                chunkedid++;
    611608                if(chunkedid > 2 && c == '\n')
    612609                        break;
    613610        }
    614 printf("8888888\n");
     611
    615612        len = strtol(chunked, NULL, 16);
    616 printf("999999999\n");
    617613        debug(99, "chunkedlen=%u", len);
    618614        return len;
     
    625621{
    626622        int sock = -1, ret = 0, count = 0, hret = 0, freeheader = 0, gzip = 0;
    627         int headerlen = 0, chunkedlen = 0, chunked = 0;
     623        int headerlen = 0, chunkedlen = 0, chunked = 0, readsize = 0;
    628624        unsigned int len = 0, maxret = 0;
    629625        char *ip = NULL;
     
    734730                pbuf++;
    735731        }
     732       
     733        debug(99, "-----------------------------------------------------------------");
     734        debug(99, "header: %s", tmpbuf);
     735        debug(99, "-----------------------------------------------------------------");
    736736
    737737        if(flag == 2)
     
    752752                goto end;
    753753        }
     754       
     755        if(flag == 0) headerlen = 0;
    754756
    755757        //TODO: case-sens check
     
    760762                len = strtoul(contentlen, NULL, 10);
    761763        }
    762 
    763         debug(99, "-----------------------------------------------------------------");
    764         debug(99, "header: %s", tmpbuf);
    765         debug(99, "-----------------------------------------------------------------");
    766764       
    767765        if(filename == NULL && (flag == 0 || flag == 1) && ostrstr(tmpbuf, "gzip") != NULL)
     
    774772                chunked = 1;
    775773                chunkedlen = getchunkedlen(sock, timeout);
    776                 if(chunkedlen > MINMALLOC) chunked = 0;
    777         }
    778 
    779         if(flag == 0) headerlen = 0;
    780         if(chunked == 0) chunkedlen = MINMALLOC - headerlen;
    781         while((ret = sockread(sock, (unsigned char*)tmpbuf + headerlen, 0, chunkedlen, timeout * 1000, 0)) > 0)
    782         {
     774                if(chunkedlen + headerlen > MINMALLOC)
     775                        readsize = MINMALLOC - headerlen;
     776                else
     777                        readsize = chunkedlen;
     778        }
     779
     780        if(chunked == 0) readsize = MINMALLOC - headerlen;
     781        while((ret = sockread(sock, (unsigned char*)tmpbuf + headerlen, 0, readsize, timeout * 1000, 0)) > 0)
     782        {
     783                if(chunked == 1) chunkedlen -= ret;
     784
    783785                maxret += ret;
    784786                if(len > 0)
     
    804806                memset(tmpbuf, 0, ret);
    805807               
    806                 if(chunked == 1)
     808                if(chunked == 1 && chunkedlen == 0)
    807809                {
    808810                        chunkedlen = getchunkedlen(sock, timeout);
    809                         if(chunkedlen > MINMALLOC) chunked = 0;
    810                 }
    811                 if(chunked == 0) chunkedlen = MINMALLOC - headerlen;
     811                        if(chunkedlen + headerlen > MINMALLOC)
     812                                readsize = MINMALLOC - headerlen;
     813                        else
     814                                readsize = chunkedlen;
     815                }
     816                if(chunked == 1 && chunkedlen > 0)
     817                {
     818                        if(chunkedlen + headerlen > MINMALLOC)
     819                                readsize = MINMALLOC - headerlen;
     820                        else
     821                                readsize = chunkedlen;
     822                }
     823                if(chunked == 0) readsize = MINMALLOC - headerlen;
    812824        }
    813825        if(ret < 0)
     
    828840
    829841end:
    830 printf("aaaaaaaa\n");
     842
    831843        free(tmpbuf);
    832844        if(fd != NULL) fclose(fd);
    833845        sockclose(&sock);
    834 printf("bbbbbb\n");     
     846
    835847        if(gzip != 0)
    836848        {
     
    872884                debug(99, "http unzip end");
    873885        }
    874 printf("ccccccccc\n");
     886
    875887        if(filename == NULL)
    876888        {
     
    878890                buf[count] = '\0';
    879891        }
    880 printf("ddddddddd\n");
     892
    881893        if((hret == 301 || hret == 302) && retstr != NULL && redirect < 3) //redirect
    882894        {
     
    901913                        }
    902914                }
    903 printf("eeeeeeeee\n");
     915
    904916                redirect++;
    905917                free(buf); buf = NULL;
     
    907919                free(rhost); rhost = NULL;
    908920        }
    909 printf("ffffffff\n");
     921
    910922        if(clen != 0) *clen = maxret;
    911923        if(dnode != NULL) dnode->ret = 0;
    912924        free(retstr); retstr = NULL;
    913 printf("ggggggggggg\n");
     925
    914926        if(filename == NULL)
    915927                return buf;
Note: See TracChangeset for help on using the changeset viewer.