avutil/opt: Avoid av_strdup(NULL)
It is not documented to be safe and in any case it is nonsense: Currently av_strdup(NULL) returns NULL and in order to distinguish this from a genuine allocation failure, opt_copy_elem() checked afterwards whether src was actually NULL. But then one can simply check in advance whether one should call av_strdup() at all. set_string() was even worse and returned ENOMEM in case the value to be duplicated is NULL; this only worked because av_opt_set_defaults2() does not check the return value at all (given that it can't propagate it). These two places account for 389114 of 390356 av_strdup(NULL) calls during one FATE run. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
		
							parent
							
								
									686d33a6b0
								
							
						
					
					
						commit
						aa7d6520e6
					
				| @ -309,6 +309,8 @@ static int set_string_binary(void *obj, const AVOption *o, const char *val, uint | ||||
| static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **dst) | ||||
| { | ||||
|     av_freep(dst); | ||||
|     if (!val) | ||||
|         return 0; | ||||
|     *dst = av_strdup(val); | ||||
|     return *dst ? 0 : AVERROR(ENOMEM); | ||||
| } | ||||
| @ -2032,9 +2034,11 @@ static int opt_copy_elem(void *logctx, enum AVOptionType type, | ||||
|     if (type == AV_OPT_TYPE_STRING) { | ||||
|         if (*dst8 != *src8) | ||||
|             av_freep(dst8); | ||||
|         if (*src8) { | ||||
|             *dst8 = av_strdup(*src8); | ||||
|         if (*src8 && !*dst8) | ||||
|             if (!*dst8) | ||||
|                 return AVERROR(ENOMEM); | ||||
|         } | ||||
|     } else if (type == AV_OPT_TYPE_BINARY) { | ||||
|         int len = *(const int *)(src8 + 1); | ||||
|         if (*dst8 != *src8) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user