]> granicus.if.org Git - php/commitdiff
do not fail & segfault if malloc(0) returns NULL, that's expected
authorAntony Dovgal <tony2001@php.net>
Sat, 9 Aug 2008 22:00:51 +0000 (22:00 +0000)
committerAntony Dovgal <tony2001@php.net>
Sat, 9 Aug 2008 22:00:51 +0000 (22:00 +0000)
(reproducible on AIX with simple date() and UTC timezone)

ext/date/lib/parse_tz.c

index 527c370b9014b57d161d5b0e50b9db75345fc051..cf421fcef88eac3684584344d7c0f6902832ee08 100644 (file)
@@ -139,46 +139,52 @@ static void read_types(char **tzf, timelib_tzinfo *tz)
        memcpy(tz->timezone_abbr, *tzf, sizeof(char) * tz->charcnt);
        *tzf += sizeof(char) * tz->charcnt;
 
-       leap_buffer = (int32_t *) malloc(tz->leapcnt * 2 * sizeof(int32_t));
-       if (!leap_buffer) {
-               return;
-       }
-       memcpy(leap_buffer, *tzf, sizeof(int32_t) * tz->leapcnt * 2);
-       *tzf += sizeof(int32_t) * tz->leapcnt * 2;
+       if (tz->leapcnt) {
+               leap_buffer = (int32_t *) malloc(tz->leapcnt * 2 * sizeof(int32_t));
+               if (!leap_buffer) {
+                       return;
+               }
+               memcpy(leap_buffer, *tzf, sizeof(int32_t) * tz->leapcnt * 2);
+               *tzf += sizeof(int32_t) * tz->leapcnt * 2;
 
-       tz->leap_times = (tlinfo*) malloc(tz->leapcnt * sizeof(tlinfo));
-       if (!tz->leap_times) {
-               return;
-       }
-       for (i = 0; i < tz->leapcnt; i++) {
-               tz->leap_times[i].trans = timelib_conv_int(leap_buffer[i * 2]);
-               tz->leap_times[i].offset = timelib_conv_int(leap_buffer[i * 2 + 1]);
-       }
-       free(leap_buffer);
-       
-       buffer = (unsigned char*) malloc(tz->ttisstdcnt * sizeof(unsigned char));
-       if (!buffer) {
-               return;
+               tz->leap_times = (tlinfo*) malloc(tz->leapcnt * sizeof(tlinfo));
+               if (!tz->leap_times) {
+                       return;
+               }
+               for (i = 0; i < tz->leapcnt; i++) {
+                       tz->leap_times[i].trans = timelib_conv_int(leap_buffer[i * 2]);
+                       tz->leap_times[i].offset = timelib_conv_int(leap_buffer[i * 2 + 1]);
+               }
+               free(leap_buffer);
        }
-       memcpy(buffer, *tzf, sizeof(unsigned char) * tz->ttisstdcnt);
-       *tzf += sizeof(unsigned char) * tz->ttisstdcnt;
 
-       for (i = 0; i < tz->ttisstdcnt; i++) {
-               tz->type[i].isstdcnt = buffer[i];
-       }
-       free(buffer);
+       if (tz->ttisstdcnt) {
+               buffer = (unsigned char*) malloc(tz->ttisstdcnt * sizeof(unsigned char));
+               if (!buffer) {
+                       return;
+               }
+               memcpy(buffer, *tzf, sizeof(unsigned char) * tz->ttisstdcnt);
+               *tzf += sizeof(unsigned char) * tz->ttisstdcnt;
 
-       buffer = (unsigned char*) malloc(tz->ttisgmtcnt * sizeof(unsigned char));
-       if (!buffer) {
-               return;
+               for (i = 0; i < tz->ttisstdcnt; i++) {
+                       tz->type[i].isstdcnt = buffer[i];
+               }
+               free(buffer);
        }
-       memcpy(buffer, *tzf, sizeof(unsigned char) * tz->ttisgmtcnt);
-       *tzf += sizeof(unsigned char) * tz->ttisgmtcnt;
 
-       for (i = 0; i < tz->ttisgmtcnt; i++) {
-               tz->type[i].isgmtcnt = buffer[i];
+       if (tz->ttisgmtcnt) {
+               buffer = (unsigned char*) malloc(tz->ttisgmtcnt * sizeof(unsigned char));
+               if (!buffer) {
+                       return;
+               }
+               memcpy(buffer, *tzf, sizeof(unsigned char) * tz->ttisgmtcnt);
+               *tzf += sizeof(unsigned char) * tz->ttisgmtcnt;
+
+               for (i = 0; i < tz->ttisgmtcnt; i++) {
+                       tz->type[i].isgmtcnt = buffer[i];
+               }
+               free(buffer);
        }
-       free(buffer);
 }
 
 static void read_location(char **tzf, timelib_tzinfo *tz)