aboutsummaryrefslogtreecommitdiff
path: root/contrib/file/src/funcs.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/file/src/funcs.c')
-rw-r--r--contrib/file/src/funcs.c121
1 files changed, 85 insertions, 36 deletions
diff --git a/contrib/file/src/funcs.c b/contrib/file/src/funcs.c
index 71041441e290..af15d6988635 100644
--- a/contrib/file/src/funcs.c
+++ b/contrib/file/src/funcs.c
@@ -27,7 +27,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.129 2022/05/28 20:24:09 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.140 2023/05/21 17:08:34 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -51,7 +51,7 @@ FILE_RCSID("@(#)$File: funcs.c,v 1.129 2022/05/28 20:24:09 christos Exp $")
#define SIZE_MAX ((size_t)~0)
#endif
-protected char *
+file_protected char *
file_copystr(char *buf, size_t blen, size_t width, const char *str)
{
if (blen == 0)
@@ -63,7 +63,7 @@ file_copystr(char *buf, size_t blen, size_t width, const char *str)
return buf;
}
-private void
+file_private void
file_clearbuf(struct magic_set *ms)
{
free(ms->o.buf);
@@ -71,7 +71,7 @@ file_clearbuf(struct magic_set *ms)
ms->o.blen = 0;
}
-private int
+file_private int
file_checkfield(char *msg, size_t mlen, const char *what, const char **pp)
{
const char *p = *pp;
@@ -90,7 +90,7 @@ file_checkfield(char *msg, size_t mlen, const char *what, const char **pp)
return 0;
}
-protected int
+file_protected int
file_checkfmt(char *msg, size_t mlen, const char *fmt)
{
const char *p;
@@ -129,7 +129,7 @@ file_checkfmt(char *msg, size_t mlen, const char *fmt)
/*
* Like printf, only we append to a buffer.
*/
-protected int
+file_protected int
file_vprintf(struct magic_set *ms, const char *fmt, va_list ap)
{
int len;
@@ -172,7 +172,7 @@ out:
return -1;
}
-protected int
+file_protected int
file_printf(struct magic_set *ms, const char *fmt, ...)
{
int rv;
@@ -189,7 +189,7 @@ file_printf(struct magic_set *ms, const char *fmt, ...)
*/
/*VARARGS*/
__attribute__((__format__(__printf__, 3, 0)))
-private void
+file_private void
file_error_core(struct magic_set *ms, int error, const char *f, va_list va,
size_t lineno)
{
@@ -210,7 +210,7 @@ file_error_core(struct magic_set *ms, int error, const char *f, va_list va,
}
/*VARARGS*/
-protected void
+file_protected void
file_error(struct magic_set *ms, int error, const char *f, ...)
{
va_list va;
@@ -223,7 +223,7 @@ file_error(struct magic_set *ms, int error, const char *f, ...)
* Print an error with magic line number.
*/
/*VARARGS*/
-protected void
+file_protected void
file_magerror(struct magic_set *ms, const char *f, ...)
{
va_list va;
@@ -232,20 +232,20 @@ file_magerror(struct magic_set *ms, const char *f, ...)
va_end(va);
}
-protected void
+file_protected void
file_oomem(struct magic_set *ms, size_t len)
{
file_error(ms, errno, "cannot allocate %" SIZE_T_FORMAT "u bytes",
len);
}
-protected void
+file_protected void
file_badseek(struct magic_set *ms)
{
file_error(ms, errno, "error seeking");
}
-protected void
+file_protected void
file_badread(struct magic_set *ms)
{
file_error(ms, errno, "error reading");
@@ -254,7 +254,7 @@ file_badread(struct magic_set *ms)
#ifndef COMPILE_ONLY
#define FILE_SEPARATOR "\n- "
-protected int
+file_protected int
file_separator(struct magic_set *ms)
{
return file_printf(ms, FILE_SEPARATOR);
@@ -289,7 +289,7 @@ checkdone(struct magic_set *ms, int *rv)
return 0;
}
-protected int
+file_protected int
file_default(struct magic_set *ms, size_t nb)
{
if (ms->flags & MAGIC_MIME) {
@@ -319,7 +319,7 @@ file_default(struct magic_set *ms, size_t nb)
* -1: error
*/
/*ARGSUSED*/
-protected int
+file_protected int
file_buffer(struct magic_set *ms, int fd, struct stat *st,
const char *inname __attribute__ ((__unused__)),
const void *buf, size_t nb)
@@ -398,7 +398,7 @@ file_buffer(struct magic_set *ms, int fd, struct stat *st,
/* Check if we have a CSV file */
if ((ms->flags & MAGIC_NO_CHECK_CSV) == 0) {
- m = file_is_csv(ms, &b, looks_text);
+ m = file_is_csv(ms, &b, looks_text, code);
if ((ms->flags & MAGIC_DEBUG) != 0)
(void)fprintf(stderr, "[try csv %d]\n", m);
if (m) {
@@ -407,6 +407,17 @@ file_buffer(struct magic_set *ms, int fd, struct stat *st,
}
}
+ /* Check if we have a SIMH tape file */
+ if ((ms->flags & MAGIC_NO_CHECK_SIMH) == 0) {
+ m = file_is_simh(ms, &b);
+ if ((ms->flags & MAGIC_DEBUG) != 0)
+ (void)fprintf(stderr, "[try simh %d]\n", m);
+ if (m) {
+ if (checkdone(ms, &rv))
+ goto done;
+ }
+ }
+
/* Check if we have a CDF file */
if ((ms->flags & MAGIC_NO_CHECK_CDF) == 0) {
m = file_trycdf(ms, &b);
@@ -500,7 +511,7 @@ simple:
}
#endif
-protected int
+file_protected int
file_reset(struct magic_set *ms, int checkloaded)
{
if (checkloaded && ms->mlist[0] == NULL) {
@@ -525,7 +536,7 @@ file_reset(struct magic_set *ms, int checkloaded)
*(n)++ = ((CAST(uint32_t, *(o)) >> 0) & 7) + '0', \
(o)++)
-protected const char *
+file_protected const char *
file_getbuffer(struct magic_set *ms)
{
char *pbuf, *op, *np;
@@ -603,7 +614,7 @@ file_getbuffer(struct magic_set *ms)
return ms->o.pbuf;
}
-protected int
+file_protected int
file_check_mem(struct magic_set *ms, unsigned int level)
{
size_t len;
@@ -626,13 +637,13 @@ file_check_mem(struct magic_set *ms, unsigned int level)
return 0;
}
-protected size_t
+file_protected size_t
file_printedlen(const struct magic_set *ms)
{
return ms->o.blen;
}
-protected int
+file_protected int
file_replace(struct magic_set *ms, const char *pat, const char *rep)
{
file_regex_t rx;
@@ -656,10 +667,44 @@ out:
return rv;
}
-protected int
+file_private int
+check_regex(struct magic_set *ms, const char *pat)
+{
+ char sbuf[512];
+ unsigned char oc = '\0';
+ const char *p;
+
+ for (p = pat; *p; p++) {
+ unsigned char c = *p;
+ // Avoid repetition
+ if (c == oc && strchr("?*+{", c) != NULL) {
+ size_t len = strlen(pat);
+ file_magwarn(ms,
+ "repetition-operator operand `%c' "
+ "invalid in regex `%s'", c,
+ file_printable(ms, sbuf, sizeof(sbuf), pat, len));
+ return -1;
+ }
+ oc = c;
+ if (isprint(c) || isspace(c) || c == '\b'
+ || c == 0x8a) // XXX: apple magic fixme
+ continue;
+ size_t len = strlen(pat);
+ file_magwarn(ms,
+ "non-ascii characters in regex \\%#o `%s'",
+ c, file_printable(ms, sbuf, sizeof(sbuf), pat, len));
+ return -1;
+ }
+ return 0;
+}
+
+file_protected int
file_regcomp(struct magic_set *ms file_locale_used, file_regex_t *rx,
const char *pat, int flags)
{
+ if (check_regex(ms, pat) == -1)
+ return -1;
+
#ifdef USE_C_LOCALE
locale_t old = uselocale(ms->c_lc_ctype);
assert(old != NULL);
@@ -677,16 +722,18 @@ file_regcomp(struct magic_set *ms file_locale_used, file_regex_t *rx,
(void)setlocale(LC_CTYPE, old);
#endif
if (rc > 0 && (ms->flags & MAGIC_CHECK)) {
- char errmsg[512];
+ char errmsg[512], buf[512];
(void)regerror(rc, rx, errmsg, sizeof(errmsg));
- file_magerror(ms, "regex error %d for `%s', (%s)", rc, pat,
+ file_magerror(ms, "regex error %d for `%s', (%s)", rc,
+ file_printable(ms, buf, sizeof(buf), pat, strlen(pat)),
errmsg);
}
return rc;
}
-protected int
+/*ARGSUSED*/
+file_protected int
file_regexec(struct magic_set *ms file_locale_used, file_regex_t *rx,
const char *str, size_t nmatch, regmatch_t* pmatch, int eflags)
{
@@ -711,13 +758,13 @@ file_regexec(struct magic_set *ms file_locale_used, file_regex_t *rx,
return rc;
}
-protected void
+file_protected void
file_regfree(file_regex_t *rx)
{
regfree(rx);
}
-protected file_pushbuf_t *
+file_protected file_pushbuf_t *
file_push_buffer(struct magic_set *ms)
{
file_pushbuf_t *pb;
@@ -739,7 +786,7 @@ file_push_buffer(struct magic_set *ms)
return pb;
}
-protected char *
+file_protected char *
file_pop_buffer(struct magic_set *ms, file_pushbuf_t *pb)
{
char *rbuf;
@@ -763,7 +810,7 @@ file_pop_buffer(struct magic_set *ms, file_pushbuf_t *pb)
/*
* convert string to ascii printable format.
*/
-public char *
+file_protected char *
file_printable(struct magic_set *ms, char *buf, size_t bufsiz,
const char *str, size_t slen)
{
@@ -794,7 +841,7 @@ struct guid {
uint8_t data4[8];
};
-protected int
+file_protected int
file_parse_guid(const char *s, uint64_t *guid)
{
struct guid *g = CAST(struct guid *, CAST(void *, guid));
@@ -819,7 +866,7 @@ file_parse_guid(const char *s, uint64_t *guid)
#endif
}
-protected int
+file_protected int
file_print_guid(char *str, size_t len, const uint64_t *guid)
{
const struct guid *g = CAST(const struct guid *,
@@ -840,10 +887,12 @@ file_print_guid(char *str, size_t len, const uint64_t *guid)
#endif
}
-protected int
+file_protected int
file_pipe_closexec(int *fds)
{
-#ifdef HAVE_PIPE2
+#ifdef __MINGW32__
+ return 0;
+#elif defined(HAVE_PIPE2)
return pipe2(fds, O_CLOEXEC);
#else
if (pipe(fds) == -1)
@@ -856,7 +905,7 @@ file_pipe_closexec(int *fds)
#endif
}
-protected int
+file_protected int
file_clear_closexec(int fd) {
#ifdef F_SETFD
return fcntl(fd, F_SETFD, 0);
@@ -865,7 +914,7 @@ file_clear_closexec(int fd) {
#endif
}
-protected char *
+file_protected char *
file_strtrim(char *str)
{
char *last;