* Add strstrc() function which helps avoid a couple reads of unitialized memory.

This commit is contained in:
Justin Maggard 2009-11-12 01:53:40 +00:00
parent d25f3a6c14
commit 24ff2a8a1c
3 changed files with 44 additions and 9 deletions

View File

@ -254,12 +254,12 @@ intervening space) by either an integer or the keyword "infinite". */
h->reqflags |= FLAG_NO_RESIZE;
//h->reqflags |= FLAG_MIME_AVI_DIVX;
}
else if(strstr(p, "bridgeCo-DMP/3"))
else if(strstrc(p, "bridgeCo-DMP/3", '\r'))
{
h->req_client = EDenonReceiver;
h->reqflags |= FLAG_DLNA;
}
else if(strstr(p, "fbxupnpav/"))
else if(strstrc(p, "fbxupnpav/", '\r'))
{
h->req_client = EFreeBox;
}
@ -268,7 +268,7 @@ intervening space) by either an integer or the keyword "infinite". */
h->req_client = EPopcornHour;
h->reqflags |= FLAG_MIME_FLAC_FLAC;
}
else if(strcasestr(p, "DLNADOC/1.50"))
else if(strstrc(p, "DLNADOC/1.50", '\r'))
{
h->req_client = EStandardDLNA150;
h->reqflags |= FLAG_DLNA;
@ -354,7 +354,9 @@ next_header:
h->req_chunklen = -1;
if( h->req_buflen <= h->req_contentoff )
return;
while( (h->req_chunklen = strtol(line, &endptr, 16)) && (endptr != line) )
while( (line < (h->req_buf + h->req_buflen)) &&
(h->req_chunklen = strtol(line, &endptr, 16)) &&
(endptr != line) )
{
while(!(endptr[0] == '\r' && endptr[1] == '\n'))
{
@ -721,6 +723,7 @@ ProcessHttpQuery_upnphttp(struct upnphttp * h)
DPRINTF(E_WARN, L_HTTP, "DLNA %s requested, responding ERROR 406\n",
h->reqflags&FLAG_TIMESEEK ? "TimeSeek" : "PlaySpeed");
Send406(h);
return;
}
#endif
else if(strcmp("GET", HttpCommand) == 0)
@ -765,7 +768,6 @@ ProcessHttpQuery_upnphttp(struct upnphttp * h)
else if(strncmp(HttpUrl, "/Thumbnails/", 12) == 0)
{
SendResp_thumbnail(h, HttpUrl+12);
CloseSocket_upnphttp(h);
}
else if(strncmp(HttpUrl, "/AlbumArt/", 10) == 0)
{
@ -1041,7 +1043,7 @@ send_data(struct upnphttp * h, char * header, size_t size)
n = send(h->socket, header, size, 0);
if(n<0)
{
DPRINTF(E_ERROR, L_HTTP, "send(res_buf): %s", strerror(errno));
DPRINTF(E_ERROR, L_HTTP, "send(res_buf): %s\n", strerror(errno));
}
else if(n < h->res_buflen)
{
@ -1196,6 +1198,7 @@ SendResp_albumArt(struct upnphttp * h, char * object)
"Connection: close\r\n"
"Date: %s\r\n"
"EXT:\r\n"
"realTimeInfo.dlna.org: DLNA.ORG_TLAG=*\r\n"
"contentFeatures.dlna.org: DLNA.ORG_PN=JPEG_TN\r\n"
"Server: " MINIDLNA_SERVER_STRING "\r\n",
size, date);
@ -1334,6 +1337,7 @@ SendResp_thumbnail(struct upnphttp * h, char * object)
"Connection: close\r\n"
"Date: %s\r\n"
"EXT:\r\n"
"realTimeInfo.dlna.org: DLNA.ORG_TLAG=*\r\n"
"contentFeatures.dlna.org: DLNA.ORG_PN=JPEG_TN\r\n"
"Server: " MINIDLNA_SERVER_STRING "\r\n",
ed->size, date);
@ -1353,6 +1357,7 @@ SendResp_thumbnail(struct upnphttp * h, char * object)
}
exif_data_unref(ed);
}
CloseSocket_upnphttp(h);
error:
sqlite3_free_table(result);
}
@ -1472,6 +1477,7 @@ SendResp_resizedimg(struct upnphttp * h, char * object)
"Connection: close\r\n"
"Date: %s\r\n"
"EXT:\r\n"
"realTimeInfo.dlna.org: DLNA.ORG_TLAG=*\r\n"
"contentFeatures.dlna.org: DLNA.ORG_PN=JPEG_%s;DLNA.ORG_CI=1\r\n"
"Server: " MINIDLNA_SERVER_STRING "\r\n",
date, dlna_pn);
@ -1555,9 +1561,10 @@ SendResp_resizedimg(struct upnphttp * h, char * object)
}
}
DPRINTF(E_INFO, L_HTTP, "Done serving %s\n", file_path);
if( imsrc )
image_free(imsrc);
if( imdst )
image_free(imdst);
image_free(imsrc);
resized_error:
sqlite3_free_table(result);
#if USE_FORK
@ -1762,6 +1769,7 @@ SendResp_dlnafile(struct upnphttp * h, char * object)
"Connection: close\r\n"
"Date: %s\r\n"
"EXT:\r\n"
"realTimeInfo.dlna.org: DLNA.ORG_TLAG=*\r\n"
"contentFeatures.dlna.org: %s\r\n"
"Server: " MINIDLNA_SERVER_STRING "\r\n\r\n",
date, last_file.dlna);

24
utils.c
View File

@ -57,6 +57,30 @@ trim(char *str)
return str;
}
/* Find the first occurrence of p in s, where s is terminated by t */
char *
strstrc(const char *s, const char *p, const char t)
{
char *endptr;
size_t slen, plen;
endptr = strchr(s, t);
if (!endptr)
return NULL;
plen = strlen(p);
slen = endptr - s;
while (slen >= plen)
{
if (*s == *p && strncmp(s+1, p+1, plen-1) == 0)
return (char*)s;
s++;
slen--;
}
return NULL;
}
char *
modifyString(char * string, const char * before, const char * after, short like)
{

View File

@ -16,6 +16,9 @@ ends_with(const char * haystack, const char * needle);
char *
trim(char *str);
char *
strstrc(const char *s, const char *p, const char t);
char *
modifyString(char * string, const char * before, const char * after, short like);