comparison eval.c @ 10168:6eded00bb689 libavcodec

eval: Check for return value of memory allocations.
author ramiro
date Sat, 12 Sep 2009 17:59:19 +0000
parents 685af2860d80
children e22a96273dc4
comparison
equal deleted inserted replaced
10167:0c6cba648271 10168:6eded00bb689
182 182
183 static AVEvalExpr * parse_primary(Parser *p) { 183 static AVEvalExpr * parse_primary(Parser *p) {
184 AVEvalExpr * d = av_mallocz(sizeof(AVEvalExpr)); 184 AVEvalExpr * d = av_mallocz(sizeof(AVEvalExpr));
185 char *next= p->s; 185 char *next= p->s;
186 int i; 186 int i;
187
188 if (!d)
189 return NULL;
187 190
188 /* number */ 191 /* number */
189 d->value = av_strtod(p->s, &next); 192 d->value = av_strtod(p->s, &next);
190 if(next != p->s){ 193 if(next != p->s){
191 d->type = e_value; 194 d->type = e_value;
286 return d; 289 return d;
287 } 290 }
288 291
289 static AVEvalExpr * new_eval_expr(int type, int value, AVEvalExpr *p0, AVEvalExpr *p1){ 292 static AVEvalExpr * new_eval_expr(int type, int value, AVEvalExpr *p0, AVEvalExpr *p1){
290 AVEvalExpr * e = av_mallocz(sizeof(AVEvalExpr)); 293 AVEvalExpr * e = av_mallocz(sizeof(AVEvalExpr));
294 if (!e)
295 return NULL;
291 e->type =type ; 296 e->type =type ;
292 e->value =value ; 297 e->value =value ;
293 e->param[0] =p0 ; 298 e->param[0] =p0 ;
294 e->param[1] =p1 ; 299 e->param[1] =p1 ;
295 return e; 300 return e;
305 int sign, sign2; 310 int sign, sign2;
306 AVEvalExpr * e = parse_pow(p, &sign); 311 AVEvalExpr * e = parse_pow(p, &sign);
307 while(p->s[0]=='^'){ 312 while(p->s[0]=='^'){
308 p->s++; 313 p->s++;
309 e= new_eval_expr(e_pow, 1, e, parse_pow(p, &sign2)); 314 e= new_eval_expr(e_pow, 1, e, parse_pow(p, &sign2));
315 if (!e)
316 return NULL;
310 if (e->param[1]) e->param[1]->value *= (sign2|1); 317 if (e->param[1]) e->param[1]->value *= (sign2|1);
311 } 318 }
312 if (e) e->value *= (sign|1); 319 if (e) e->value *= (sign|1);
313 return e; 320 return e;
314 } 321 }
316 static AVEvalExpr * parse_term(Parser *p){ 323 static AVEvalExpr * parse_term(Parser *p){
317 AVEvalExpr * e = parse_factor(p); 324 AVEvalExpr * e = parse_factor(p);
318 while(p->s[0]=='*' || p->s[0]=='/'){ 325 while(p->s[0]=='*' || p->s[0]=='/'){
319 int c= *p->s++; 326 int c= *p->s++;
320 e= new_eval_expr(c == '*' ? e_mul : e_div, 1, e, parse_factor(p)); 327 e= new_eval_expr(c == '*' ? e_mul : e_div, 1, e, parse_factor(p));
328 if (!e)
329 return NULL;
321 } 330 }
322 return e; 331 return e;
323 } 332 }
324 333
325 static AVEvalExpr * parse_subexpr(Parser *p) { 334 static AVEvalExpr * parse_subexpr(Parser *p) {
326 AVEvalExpr * e = parse_term(p); 335 AVEvalExpr * e = parse_term(p);
327 while(*p->s == '+' || *p->s == '-') { 336 while(*p->s == '+' || *p->s == '-') {
328 e= new_eval_expr(e_add, 1, e, parse_term(p)); 337 e= new_eval_expr(e_add, 1, e, parse_term(p));
338 if (!e)
339 return NULL;
329 }; 340 };
330 341
331 return e; 342 return e;
332 } 343 }
333 344
341 e = parse_subexpr(p); 352 e = parse_subexpr(p);
342 353
343 while(*p->s == ';') { 354 while(*p->s == ';') {
344 p->s++; 355 p->s++;
345 e= new_eval_expr(e_last, 1, e, parse_subexpr(p)); 356 e= new_eval_expr(e_last, 1, e, parse_subexpr(p));
357 if (!e)
358 return NULL;
346 }; 359 };
347 360
348 p->stack_index++; 361 p->stack_index++;
349 362
350 return e; 363 return e;