Browse code

hqdn3d: check memory allocations and propagate errors

Vittorio Giovara authored on 2015/01/30 00:55:19
Showing 1 changed files
... ...
@@ -121,11 +121,11 @@ static void denoise_spatial(HQDN3DContext *s,
121 121
 }
122 122
 
123 123
 av_always_inline
124
-static void denoise_depth(HQDN3DContext *s,
125
-                          uint8_t *src, uint8_t *dst,
126
-                          uint16_t *line_ant, uint16_t **frame_ant_ptr,
127
-                          int w, int h, int sstride, int dstride,
128
-                          int16_t *spatial, int16_t *temporal, int depth)
124
+static int denoise_depth(HQDN3DContext *s,
125
+                         uint8_t *src, uint8_t *dst,
126
+                         uint16_t *line_ant, uint16_t **frame_ant_ptr,
127
+                         int w, int h, int sstride, int dstride,
128
+                         int16_t *spatial, int16_t *temporal, int depth)
129 129
 {
130 130
     // FIXME: For 16bit depth, frame_ant could be a pointer to the previous
131 131
     // filtered frame rather than a separate buffer.
... ...
@@ -134,6 +134,8 @@ static void denoise_depth(HQDN3DContext *s,
134 134
     if (!frame_ant) {
135 135
         uint8_t *frame_src = src;
136 136
         *frame_ant_ptr = frame_ant = av_malloc(w*h*sizeof(uint16_t));
137
+        if (!frame_ant)
138
+            return AVERROR(ENOMEM);
137 139
         for (y = 0; y < h; y++, src += sstride, frame_ant += w)
138 140
             for (x = 0; x < w; x++)
139 141
                 frame_ant[x] = LOAD(x);
... ...
@@ -148,15 +150,25 @@ static void denoise_depth(HQDN3DContext *s,
148 148
         denoise_temporal(src, dst, frame_ant,
149 149
                          w, h, sstride, dstride, temporal, depth);
150 150
     emms_c();
151
+    return 0;
151 152
 }
152 153
 
153
-#define denoise(...) \
154
-    switch (s->depth) {\
155
-        case  8: denoise_depth(__VA_ARGS__,  8); break;\
156
-        case  9: denoise_depth(__VA_ARGS__,  9); break;\
157
-        case 10: denoise_depth(__VA_ARGS__, 10); break;\
158
-        case 16: denoise_depth(__VA_ARGS__, 16); break;\
159
-    }
154
+#define denoise(...)                                                          \
155
+    do {                                                                      \
156
+        int ret = AVERROR_INVALIDDATA;                                        \
157
+        switch (s->depth) {                                                   \
158
+            case  8: ret = denoise_depth(__VA_ARGS__,  8); break;             \
159
+            case  9: ret = denoise_depth(__VA_ARGS__,  9); break;             \
160
+            case 10: ret = denoise_depth(__VA_ARGS__, 10); break;             \
161
+            case 16: ret = denoise_depth(__VA_ARGS__, 16); break;             \
162
+        }                                                                     \
163
+        if (ret < 0) {                                                        \
164
+            av_frame_free(&out);                                              \
165
+            if (!direct)                                                      \
166
+                av_frame_free(&in);                                           \
167
+            return ret;                                                       \
168
+        }                                                                     \
169
+    } while (0)
160 170
 
161 171
 static int16_t *precalc_coefs(double dist25, int depth)
162 172
 {
... ...
@@ -280,13 +292,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
280 280
     HQDN3DContext *s = inlink->dst->priv;
281 281
     AVFilterLink *outlink = inlink->dst->outputs[0];
282 282
     AVFrame *out;
283
-    int direct, c;
283
+    int c, direct = av_frame_is_writable(in);
284 284
 
285
-    if (av_frame_is_writable(in)) {
286
-        direct = 1;
285
+    if (direct) {
287 286
         out = in;
288 287
     } else {
289
-        direct = 0;
290 288
         out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
291 289
         if (!out) {
292 290
             av_frame_free(&in);