aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-04-08 13:57:36 +0200
committerMattias Andrée <maandree@kth.se>2017-04-08 13:57:36 +0200
commit478b53f935264bdfe4efe394f8d804a1361a6770 (patch)
tree31c87de7b67f928ff93b4564e0929d7db2a369f8 /src
parentUpdate TODO: blind-from-sent (diff)
downloadblind-478b53f935264bdfe4efe394f8d804a1361a6770.tar.gz
blind-478b53f935264bdfe4efe394f8d804a1361a6770.tar.bz2
blind-478b53f935264bdfe4efe394f8d804a1361a6770.tar.xz
Document memory requirements, minor style fixes, more use of BUFSIZ, fix warnings, and fix potential buffer overflow
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src')
-rw-r--r--src/arg.h4
-rw-r--r--src/blind-colour-srgb.c2
-rw-r--r--src/blind-compress.c1
-rw-r--r--src/blind-concat.c4
-rw-r--r--src/blind-crop.c1
-rw-r--r--src/blind-extend.c11
-rw-r--r--src/blind-flip.c1
-rw-r--r--src/blind-flop.c1
-rw-r--r--src/blind-from-video.c8
-rw-r--r--src/blind-gauss-blur.c4
-rw-r--r--src/blind-single-colour.c8
-rw-r--r--src/blind-to-image.c2
-rw-r--r--src/blind-to-video.c2
-rw-r--r--src/blind-transpose.c1
-rw-r--r--src/stream.c31
-rw-r--r--src/stream.h12
16 files changed, 48 insertions, 45 deletions
diff --git a/src/arg.h b/src/arg.h
index 8bdbda9..1d04f24 100644
--- a/src/arg.h
+++ b/src/arg.h
@@ -73,9 +73,9 @@ extern char *argv0;
(&argv[0][1]) :\
(argc--, argv++, argv[0])))
-#define LNGARG() &argv[0][0]
+#define UARGF() EARGF(usage())
-#define EARG() EARGF(usage())
+#define LNGARG() &argv[0][0]
#define ENOFLAGS(...) ARGBEGIN {\
default:\
diff --git a/src/blind-colour-srgb.c b/src/blind-colour-srgb.c
index 53fb784..5e6c0db 100644
--- a/src/blind-colour-srgb.c
+++ b/src/blind-colour-srgb.c
@@ -12,7 +12,7 @@ main(int argc, char *argv[])
ARGBEGIN {
case 'd':
- depth = etoi_flag('d', EARG(), 1, 64);
+ depth = etoi_flag('d', UARGF(), 1, 64);
break;
case 'l':
linear = 1;
diff --git a/src/blind-compress.c b/src/blind-compress.c
index 768ef06..c70a066 100644
--- a/src/blind-compress.c
+++ b/src/blind-compress.c
@@ -51,7 +51,6 @@ main(int argc, char *argv[])
buf[0] = emalloc(n);
buf[1] = ecalloc(1, n);
- memcpy(buf[0], stream.buf, stream.ptr);
for (i = 0; eread_frame(&stream, buf[i], n); i ^= 1) {
parts = compare(buf[i], buf[i ^ 1], n, &cmp, &cmpsize);
for (off = part = 0; part < parts; part += 2) {
diff --git a/src/blind-concat.c b/src/blind-concat.c
index f6fe504..f59bee5 100644
--- a/src/blind-concat.c
+++ b/src/blind-concat.c
@@ -209,10 +209,10 @@ main(int argc, char *argv[])
ARGBEGIN {
case 'o':
- output_file = EARG();
+ output_file = UARGF();
break;
case 'j':
- jobs = etozu_flag('j', EARG(), 1, SHRT_MAX);
+ jobs = etozu_flag('j', UARGF(), 1, SHRT_MAX);
break;
default:
usage();
diff --git a/src/blind-crop.c b/src/blind-crop.c
index bd0b9e0..c08864e 100644
--- a/src/blind-crop.c
+++ b/src/blind-crop.c
@@ -77,7 +77,6 @@ main(int argc, char *argv[])
right_start = left + orown;
right = irown - right_start;
- memcpy(buf, stream.buf, ptr = stream.ptr);
while (eread_frame(&stream, buf, n)) {
if (tile) {
for (ptr = y = 0; y < stream.height; y++) {
diff --git a/src/blind-extend.c b/src/blind-extend.c
index 4331ae3..8b9e638 100644
--- a/src/blind-extend.c
+++ b/src/blind-extend.c
@@ -14,23 +14,23 @@ main(int argc, char *argv[])
{
struct stream stream;
char *buf, *image;
- size_t ptr, n, m, imgw, imgh, rown;
+ size_t n, m, imgw, imgh, rown;
size_t xoff, yoff, h, x, y;
size_t left = 0, right = 0, top = 0, bottom = 0;
int tile = 0;
ARGBEGIN {
case 'l':
- left = etozu_flag('l', EARG(), 0, SIZE_MAX);
+ left = etozu_flag('l', UARGF(), 0, SIZE_MAX);
break;
case 'r':
- right = etozu_flag('r', EARG(), 0, SIZE_MAX);
+ right = etozu_flag('r', UARGF(), 0, SIZE_MAX);
break;
case 'a':
- top = etozu_flag('a', EARG(), 0, SIZE_MAX);
+ top = etozu_flag('a', UARGF(), 0, SIZE_MAX);
break;
case 'b':
- bottom = etozu_flag('b', EARG(), 0, SIZE_MAX);
+ bottom = etozu_flag('b', UARGF(), 0, SIZE_MAX);
break;
case 't':
tile = 1;
@@ -80,7 +80,6 @@ main(int argc, char *argv[])
xoff = (rown - left % rown) % rown;
yoff = (stream.height - top % stream.height) % stream.height;
- memcpy(buf, stream.buf, ptr = stream.ptr);
while (eread_frame(&stream, buf, n)) {
if (!tile) {
for (y = 0; y < stream.height; y++)
diff --git a/src/blind-flip.c b/src/blind-flip.c
index 98e0d58..0c18602 100644
--- a/src/blind-flip.c
+++ b/src/blind-flip.c
@@ -26,7 +26,6 @@ main(int argc, char *argv[])
n = stream.height * (row_size = stream.width * stream.pixel_size);
buf = emalloc(n);
- memcpy(buf, stream.buf, stream.ptr);
while (eread_frame(&stream, buf, n))
for (ptr = n; ptr;)
ewriteall(STDOUT_FILENO, buf + (ptr -= row_size), row_size, "<stdout>");
diff --git a/src/blind-flop.c b/src/blind-flop.c
index e98771d..5f737f3 100644
--- a/src/blind-flop.c
+++ b/src/blind-flop.c
@@ -30,7 +30,6 @@ main(int argc, char *argv[])
image = emalloc(n);
m = n - stream.pixel_size;
- memcpy(buf, stream.buf, stream.ptr);
while (eread_row(&stream, buf, n)) {
for (i = 0; i < stream.pixel_size; i++)
for (j = 0; j < n; j += stream.pixel_size)
diff --git a/src/blind-from-video.c b/src/blind-from-video.c
index f164195..7f3aa13 100644
--- a/src/blind-from-video.c
+++ b/src/blind-from-video.c
@@ -172,7 +172,7 @@ convert(const char *infile, int outfd, const char *outfile, size_t width, size_t
if (dup2(pipe_rw[1], STDOUT_FILENO) == -1)
eprintf("dup2:");
close(pipe_rw[1]);
- execvp("ffmpeg", cmd);
+ execvp("ffmpeg", (char **)(void *)cmd);
eprintf("exec ffmpeg:");
}
@@ -221,13 +221,13 @@ main(int argc, char *argv[])
skip_length = 1;
break;
case 'r':
- frame_rate = EARG();
+ frame_rate = UARGF();
break;
case 'w':
- width = etozu_flag('w', EARG(), 1, SIZE_MAX);
+ width = etozu_flag('w', UARGF(), 1, SIZE_MAX);
break;
case 'h':
- height = etozu_flag('h', EARG(), 1, SIZE_MAX);
+ height = etozu_flag('h', UARGF(), 1, SIZE_MAX);
break;
default:
usage();
diff --git a/src/blind-gauss-blur.c b/src/blind-gauss-blur.c
index ef0ebba..542b44b 100644
--- a/src/blind-gauss-blur.c
+++ b/src/blind-gauss-blur.c
@@ -317,10 +317,10 @@ main(int argc, char *argv[])
measure_y_only = 1;
break;
case 'j':
- jobs = etozu_flag('j', EARG(), 1, SHRT_MAX);
+ jobs = etozu_flag('j', UARGF(), 1, SHRT_MAX);
break;
case 's':
- arg = EARG();
+ arg = UARGF();
if (!strcmp(arg, "auto"))
auto_spread = 1;
else
diff --git a/src/blind-single-colour.c b/src/blind-single-colour.c
index 2784f97..a0f5ccb 100644
--- a/src/blind-single-colour.c
+++ b/src/blind-single-colour.c
@@ -16,7 +16,7 @@ main(int argc, char *argv[])
struct stream stream;
double X, Y, Z, alpha = 1;
size_t x, y, n;
- pixel_t buf[1024];
+ pixel_t buf[BUFSIZ / 4];
ssize_t r;
int inf = 0;
char *arg;
@@ -27,17 +27,17 @@ main(int argc, char *argv[])
ARGBEGIN {
case 'f':
- arg = EARG();
+ arg = UARGF();
if (!strcmp(arg, "inf"))
inf = 1, stream.frames = 0;
else
stream.frames = etozu_flag('f', arg, 1, SIZE_MAX);
break;
case 'w':
- stream.width = etozu_flag('w', EARG(), 1, SIZE_MAX);
+ stream.width = etozu_flag('w', UARGF(), 1, SIZE_MAX);
break;
case 'h':
- stream.height = etozu_flag('h', EARG(), 1, SIZE_MAX);
+ stream.height = etozu_flag('h', UARGF(), 1, SIZE_MAX);
break;
default:
usage();
diff --git a/src/blind-to-image.c b/src/blind-to-image.c
index 761722a..4512085 100644
--- a/src/blind-to-image.c
+++ b/src/blind-to-image.c
@@ -91,7 +91,7 @@ main(int argc, char *argv[])
ARGBEGIN {
case 'd':
- depth = etoi_flag('d', EARG(), 1, 64);
+ depth = etoi_flag('d', UARGF(), 1, 64);
break;
case 'f':
farbfeld = 1;
diff --git a/src/blind-to-video.c b/src/blind-to-video.c
index 0793a0a..04cfd91 100644
--- a/src/blind-to-video.c
+++ b/src/blind-to-video.c
@@ -123,7 +123,7 @@ main(int argc, char *argv[])
if (dup2(pipe_rw[0], STDIN_FILENO) == -1)
eprintf("dup2:");
close(pipe_rw[0]);
- execvp("ffmpeg", cmd);
+ execvp("ffmpeg", (char **)(void *)cmd);
eprintf("exec ffmpeg:");
}
diff --git a/src/blind-transpose.c b/src/blind-transpose.c
index 7bc124d..cf1036b 100644
--- a/src/blind-transpose.c
+++ b/src/blind-transpose.c
@@ -35,7 +35,6 @@ main(int argc, char *argv[])
srch *= ps;
srcw *= dx = imgw * ps;
imgw *= ps;
- memcpy(buf, stream.buf, stream.ptr);
while (eread_frame(&stream, buf, n)) {
for (b = y = 0; y < srch; y += ps)
for (x = 0; x < srcw; x += dx)
diff --git a/src/stream.c b/src/stream.c
index 4b2cc23..a54f7f0 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -32,14 +32,11 @@ eninit_stream(int status, struct stream *stream)
}
*p = '\0';
- w = strchr(stream->buf, ' ');
- if (!w)
+ if (!(w = strchr(stream->buf, ' ')))
goto bad_format;
- h = strchr(w + 1, ' ');
- if (!h)
+ if (!(h = strchr(w + 1, ' ')))
goto bad_format;
- f = strchr(h + 1, ' ');
- if (!f)
+ if (!(f = strchr(h + 1, ' ')))
goto bad_format;
*w++ = *h++ = *f++ = '\0';
@@ -89,6 +86,8 @@ eninit_stream(int status, struct stream *stream)
enset_pixel_size(status, stream);
+ stream->xptr = 0;
+
return;
bad_format:
enprintf(status, "%s: file format not supported\n", stream->file);
@@ -181,19 +180,29 @@ enread_frame(int status, struct stream *stream, void *buf, size_t n)
{
char *buffer = buf;
ssize_t r;
- for (; stream->ptr < n; stream->ptr += (size_t)r) {
- r = read(stream->fd, buffer + stream->ptr, n - stream->ptr);
+ size_t m;
+
+ if (stream->ptr) {
+ m = stream->ptr < n ? stream->ptr : n;
+ memcpy(buffer + stream->xptr, stream->buf, m);
+ memmove(stream->buf, stream->buf + m, stream->ptr -= m);
+ stream->xptr += m;
+ }
+
+ for (; stream->xptr < n; stream->xptr += (size_t)r) {
+ r = read(stream->fd, buffer + stream->xptr, n - stream->xptr);
if (r < 0) {
enprintf(status, "read %s:", stream->file);
} else if (r == 0) {
- if (!stream->ptr)
+ if (!stream->xptr)
break;
enprintf(status, "%s: incomplete frame", stream->file);
}
}
- if (!stream->ptr)
+
+ if (!stream->xptr)
return 0;
- stream->ptr -= n;
+ stream->xptr -= n;
return 1;
}
diff --git a/src/stream.h b/src/stream.h
index f2d88ed..a5cebc6 100644
--- a/src/stream.h
+++ b/src/stream.h
@@ -36,8 +36,7 @@
#define process_multiple_streams(...) nprocess_multiple_streams(1, __VA_ARGS__)
#define process_each_frame_two_streams(...) nprocess_each_frame_two_streams(1, __VA_ARGS__)
-struct stream
-{
+struct stream {
size_t frames;
size_t width;
size_t height;
@@ -45,7 +44,8 @@ struct stream
char pixfmt[32];
int fd;
size_t ptr;
- char buf[4096];
+ size_t xptr;
+ char buf[BUFSIZ];
const char *file;
size_t headlen;
};
@@ -62,13 +62,13 @@ void encheck_compat(int status, const struct stream *a, const struct stream *b);
int enread_frame(int status, struct stream *stream, void *buf, size_t n);
void nprocess_each_frame_segmented(int status, struct stream *stream, int output_fd, const char* output_fname,
- void (*process)(struct stream *stream, size_t n, size_t frame));
+ void (*process)(struct stream *stream, size_t n, size_t frame));
void nprocess_two_streams(int status, struct stream *left, struct stream *right, int output_fd, const char* output_fname,
- void (*process)(struct stream *left, struct stream *right, size_t n));
+ void (*process)(struct stream *left, struct stream *right, size_t n));
void nprocess_multiple_streams(int status, struct stream *streams, size_t n_streams, int output_fd, const char* output_fname,
- void (*process)(struct stream *streams, size_t n_streams, size_t n));
+ void (*process)(struct stream *streams, size_t n_streams, size_t n));
void nprocess_each_frame_two_streams(int status, struct stream *left, struct stream *right, int output_fd, const char* output_fname,
void (*process)(char *restrict output, char *restrict lbuf, char *restrict rbuf,