--- deliantra/Deliantra-Client/Client.xs 2008/04/10 14:35:50 1.258 +++ deliantra/Deliantra-Client/Client.xs 2008/05/20 02:47:21 1.259 @@ -2294,20 +2294,38 @@ } } - SvPOK_only (data_sv); - SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); - RETVAL = data_sv; + if (data - (uint8_t *)SvPVX (data_sv) == w * h + 5) + { + SvREFCNT_dec (data_sv); + RETVAL = &PL_sv_undef; + } + else + { + SvPOK_only (data_sv); + SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); + RETVAL = data_sv; + } } OUTPUT: RETVAL void -set_rect (DC::Map self, int x0, int y0, uint8_t *data) +set_rect (DC::Map self, int x0, int y0, SV *data_sv) PPCODE: { int x, y, z; int w, h; int x1, y1; + STRLEN len; + uint8_t *data, *end; + + len = SvLEN (data_sv); + SvGROW (data_sv, len + 7); // reserve at least 7+ bytes more + data = SvPVbyte_nolen (data_sv); + end = data + len + 7; + + if (len < 5) + XSRETURN_EMPTY; if (*data++ != 0) XSRETURN_EMPTY; /* version mismatch */ @@ -2332,7 +2350,12 @@ for (x = x0; x < x1; x++) { - uint8_t flags = *data++; + uint8_t flags; + + if (data + 7 >= end) + XSRETURN_EMPTY; + + flags = *data++; if (flags) {