From e7aea0c6f323c6bbf364093305e60bb78999a23f Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Tue, 11 Jun 2013 21:07:30 -0400 Subject: [PATCH] liblbx: Properly report errors in lbx_(img_)fopen. The lbx_fopen and lbx_img_fopen functions were not properly pushing an error code when they failed, leading to extremely helpful messages of the form: lbximg: failed to open image: Success. It further turns out that pushing negative errors (i.e., -errno) was documented but never actually tested or used, so fix that up, too. It is likely that many other sites are lacking appropriate calls to lbx_error_raise, which can be added later. --- src/error.c | 24 +++++++++++++++++------- src/image.c | 7 +++++-- src/lbx.c | 7 +++++-- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/error.c b/src/error.c index c32d3b6..3e47204 100644 --- a/src/error.c +++ b/src/error.c @@ -1,7 +1,7 @@ /* * 2ooM: The Master of Orion II Reverse Engineering Project * Utilities for out-of-band error propagation. - * Copyright (C) 2010 Nick Bowler + * Copyright © 2010, 2013 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include "error.h" @@ -36,16 +38,24 @@ static unsigned error_base, error_tip; static int error_ring[LBX_ERROR_LIMIT]; static const char **user_errors; -static unsigned user_error_count; -static unsigned user_error_max = 2; +static int user_error_count, user_error_max = 2; + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) int lbx_error_new(const char *str) { - assert(user_error_count <= user_error_max); + assert(user_error_count >= 0 && user_error_count <= user_error_max); + if (!user_errors || user_error_count == user_error_max) { - size_t size = sizeof *user_errors * user_error_max * 2; const char **new; + size_t size; + + if (user_error_max >= MIN(SIZE_MAX, INT_MAX)/2 - LBX_EUBASE) + return -1; + if (2 * user_error_max >= SIZE_MAX / sizeof *user_errors) + return -1; + size = 2 * user_error_max * sizeof *user_errors; new = realloc(user_errors, size); if (!new) return -1; @@ -61,8 +71,8 @@ int lbx_error_raise(int code) { if (code == LBX_EOK) { return -1; - } else if (code >= LBX_EMAX && code < LBX_EUBASE - || code >= LBX_EUBASE + user_error_count) { + } else if (code >= 0 && ((code >= LBX_EMAX && code < LBX_EUBASE) + || code >= LBX_EUBASE + user_error_count)) { fprintf(stderr, "%s: invalid error code %d\n", __func__, code); return -1; } diff --git a/src/image.c b/src/image.c index f407a2d..4657208 100644 --- a/src/image.c +++ b/src/image.c @@ -1,7 +1,7 @@ /* * 2ooM: The Master of Orion II Reverse Engineering Project * Library for working with LBX image files. - * Copyright © 2006-2011 Nick Bowler + * Copyright © 2006-2011, 2013 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -176,14 +176,17 @@ struct lbx_image *lbx_img_fopen(const char *file) FILE *f; f = fopen(file, "rb"); - if (!f) + if (!f) { + lbx_error_raise(-errno); return NULL; + } if (fseek(f, 0, SEEK_CUR) == 0) return lbx_img_open(f, &lbx_default_fops, file_close); p = malloc(sizeof *p); if (!p) { + lbx_error_raise(LBX_ENOMEM); fclose(f); return NULL; } diff --git a/src/lbx.c b/src/lbx.c index 57a72b0..a2d3796 100644 --- a/src/lbx.c +++ b/src/lbx.c @@ -1,7 +1,7 @@ /* * 2ooM: The Master of Orion II Reverse Engineering Project * Library for working with LBX archive files. - * Copyright (C) 2006-2010 Nick Bowler + * Copyright © 2006-2010, 2013 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -166,14 +166,17 @@ struct lbx *lbx_fopen(const char *file) FILE *f; f = fopen(file, "rb"); - if (!f) + if (!f) { + lbx_error_raise(-errno); return NULL; + } if (fseek(f, 0, SEEK_CUR) == 0) return lbx_open(f, &lbx_default_fops, file_close, name); p = malloc(sizeof *p); if (!p) { + lbx_error_raise(LBX_ENOMEM); fclose(f); return NULL; } -- 2.43.0