commit - ac25a2928225d680fe46d1ff1bd086a2e7757365
commit + 322260e1783c1fb6a443258366c79d7546e4fc25
blob - c39cd8c7ce3356d52894ec5a4a8a11a6c263d92a
blob + c58a75ca2ae2256ef8090313a30b9afe6727f457
--- lib/diffreg.c
+++ lib/diffreg.c
#include "got_diff.h"
#include "diff.h"
-#include "xmalloc.h" /* XXX should return GOT_ERR_NO_MEM instead of exiting */
#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
#define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b))
};
static void diff_output(FILE *, const char *, ...);
-static void output(FILE *, struct got_diff_state *, struct got_diff_args *, const char *, FILE *, const char *, FILE *, int);
+static int output(FILE *, struct got_diff_state *, struct got_diff_args *, const char *, FILE *, const char *, FILE *, int);
static void check(struct got_diff_state *, FILE *, FILE *, int);
static void range(FILE *, int, int, char *);
static void uni_range(FILE *, int, int);
static void dump_context_vec(FILE *, struct got_diff_state *, struct got_diff_args *, FILE *, FILE *, int);
static void dump_unified_vec(FILE *, struct got_diff_state *, struct got_diff_args *, FILE *, FILE *, int);
-static void prepare(struct got_diff_state *, int, FILE *, off_t, int);
+static int prepare(struct got_diff_state *, int, FILE *, off_t, int);
static void prune(struct got_diff_state *);
static void equiv(struct line *, int, struct line *, int, int *);
static void unravel(struct got_diff_state *, int);
-static void unsort(struct line *, int, int *);
-static void change(FILE *, struct got_diff_state *, struct got_diff_args *, const char *, FILE *, const char *, FILE *, int, int, int, int, int *);
+static int unsort(struct line *, int, int *);
+static int change(FILE *, struct got_diff_state *, struct got_diff_args *, const char *, FILE *, const char *, FILE *, int, int, int, int, int *);
static void sort(struct line *, int);
static void print_header(FILE *, struct got_diff_state *, struct got_diff_args *, const char *, const char *);
static int ignoreline(char *);
static int asciifile(FILE *);
static int fetch(FILE *, struct got_diff_state *, struct got_diff_args *, long *, int, int, FILE *, int, int, int);
-static int newcand(struct got_diff_state *, int, int, int);
+static int newcand(struct got_diff_state *, int, int, int, int *);
static int search(struct got_diff_state *, int *, int, int);
static int skipline(FILE *);
static int isqrt(int);
args->status |= 1;
goto closem;
}
- prepare(ds, 0, f1, ds->stb1.st_size, flags);
- prepare(ds, 1, f2, ds->stb2.st_size, flags);
+ if (prepare(ds, 0, f1, ds->stb1.st_size, flags)) {
+ err = got_error(GOT_ERR_NO_MEM);
+ goto closem;
+ }
+ if (prepare(ds, 1, f2, ds->stb2.st_size, flags)) {
+ err = got_error(GOT_ERR_NO_MEM);
+ goto closem;
+ }
prune(ds);
sort(ds->sfile[0], ds->slen[0]);
}
ds->class = (int *)ds->file[0];
- unsort(ds->sfile[0], ds->slen[0], ds->class);
+ if (unsort(ds->sfile[0], ds->slen[0], ds->class)) {
+ err = got_error(GOT_ERR_NO_MEM);
+ goto closem;
+ }
ds->class = reallocarray(ds->class, ds->slen[0] + 2, sizeof(*ds->class));
if (ds->class == NULL) {
err = got_error(GOT_ERR_NO_MEM);
i = stone(ds, ds->class, ds->slen[0], ds->member, ds->klist, flags);
free(ds->member);
free(ds->class);
+ if (i < 0) {
+ err = got_error(GOT_ERR_NO_MEM);
+ goto closem;
+ }
ds->J = reallocarray(ds->J, ds->len[0] + 2, sizeof(*ds->J));
if (ds->J == NULL) {
goto closem;
}
check(ds, f1, f2, flags);
- output(outfile, ds, args, args->label[0], f1, args->label[1], f2, flags);
+ if (output(outfile, ds, args, args->label[0], f1, args->label[1], f2,
+ flags))
+ err = got_error(GOT_ERR_NO_MEM);
closem:
if (ds->anychange) {
args->status |= 1;
if (memcmp(buf1, buf2, i) != 0)
return (1);
}
-}
-
-char *
-splice(char *dir, char *file)
-{
- char *tail, *buf;
- size_t dirlen;
-
- dirlen = strlen(dir);
- while (dirlen != 0 && dir[dirlen - 1] == '/')
- dirlen--;
- if ((tail = strrchr(file, '/')) == NULL)
- tail = file;
- else
- tail++;
- xasprintf(&buf, "%.*s/%s", (int)dirlen, dir, tail);
- return (buf);
}
-static void
+static int
prepare(struct got_diff_state *ds, int i, FILE *fd, off_t filesize, int flags)
{
struct line *p;
if (sz < 100)
sz = 100;
- p = xcalloc(sz + 3, sizeof(*p));
+ p = calloc(sz + 3, sizeof(*p));
+ if (p == NULL)
+ return (-1);
for (j = 0; (h = readhash(ds, fd, flags));) {
if (j == sz) {
sz = sz * 3 / 2;
- p = xreallocarray(p, sz + 3, sizeof(*p));
+ p = reallocarray(p, sz + 3, sizeof(*p));
+ if (p == NULL)
+ return (-1);
}
p[++j].value = h;
}
ds->len[i] = j;
ds->file[i] = p;
+
+ return (0);
}
static void
int i, k, y, j, l;
int oldc, tc, oldl, sq;
u_int numtries, bound;
+ int error;
if (flags & D_MINIMAL)
bound = UINT_MAX;
}
k = 0;
- c[0] = newcand(ds, 0, 0, 0);
+ c[0] = newcand(ds, 0, 0, 0, &error);
+ if (error)
+ return -1;
for (i = 1; i <= n; i++) {
j = a[i];
if (j == 0)
if (ds->clist[c[l]].y <= y)
continue;
tc = c[l];
- c[l] = newcand(ds, i, y, oldc);
+ c[l] = newcand(ds, i, y, oldc, &error);
+ if (error)
+ return -1;
oldc = tc;
oldl = l;
numtries++;
} else {
- c[l] = newcand(ds, i, y, oldc);
+ c[l] = newcand(ds, i, y, oldc, &error);
+ if (error)
+ return -1;
k++;
break;
}
}
static int
-newcand(struct got_diff_state *ds, int x, int y, int pred)
+newcand(struct got_diff_state *ds, int x, int y, int pred, int *errorp)
{
struct cand *q;
if (ds->clen == ds->clistlen) {
ds->clistlen = ds->clistlen * 11 / 10;
- ds->clist = xreallocarray(ds->clist, ds->clistlen, sizeof(*ds->clist));
+ ds->clist = reallocarray(ds->clist, ds->clistlen,
+ sizeof(*ds->clist));
+ if (ds->clist == NULL) {
+ *errorp = -1;
+ return 0;
+ }
}
q = ds->clist + ds->clen;
q->x = x;
q->y = y;
q->pred = pred;
+ *errorp = 0;
return (ds->clen++);
}
}
}
-static void
+static int
unsort(struct line *f, int l, int *b)
{
int *a, i;
- a = xcalloc(l + 1, sizeof(*a));
+ a = calloc(l + 1, sizeof(*a));
+ if (a == NULL)
+ return (-1);
for (i = 1; i <= l; i++)
a[f[i].serial] = f[i].value;
for (i = 1; i <= l; i++)
b[i] = a[i];
free(a);
+
+ return (0);
}
static int
return (i);
}
-static void
+static int
output(FILE *outfile, struct got_diff_state *ds, struct got_diff_args *args,
const char *file1, FILE *f1, const char *file2, FILE *f2, int flags)
{
int m, i0, i1, j0, j1;
+ int error = 0;
rewind(f1);
rewind(f2);
i1++;
j1 = ds->J[i1 + 1] - 1;
ds->J[i1] = j1;
- change(outfile, ds, args, file1, f1, file2, f2, i0, i1, j0, j1, &flags);
+ error = change(outfile, ds, args, file1, f1, file2, f2,
+ i0, i1, j0, j1, &flags);
+ if (error)
+ return (error);
}
} else {
for (i0 = m; i0 >= 1; i0 = i1 - 1) {
i1--;
j1 = ds->J[i1 - 1] + 1;
ds->J[i1] = j1;
- change(outfile, ds, args, file1, f1, file2, f2, i1, i0, j1, j0, &flags);
+ change(outfile, ds, args, file1, f1, file2, f2, i1, i0,
+ j1, j0, &flags);
+ if (error)
+ return (error);
}
}
- if (m == 0)
- change(outfile, ds, args, file1, f1, file2, f2, 1, 0, 1, ds->len[1], &flags);
+ if (m == 0) {
+ error = change(outfile, ds, args, file1, f1, file2, f2, 1, 0,
+ 1, ds->len[1], &flags);
+ if (error)
+ return (error);
+ }
if (args->diff_format == D_IFDEF) {
for (;;) {
#define c i0
if ((c = getc(f1)) == EOF)
- return;
+ return (0);
diff_output(outfile, "%c", c);
}
#undef c
else if (args->diff_format == D_UNIFIED)
dump_unified_vec(outfile, ds, args, f1, f2, flags);
}
+
+ return (0);
}
static void
char *line;
ssize_t nr;
- line = xmalloc(rlen + 1);
- if ((nr = pread(fd, line, rlen, off)) < 0)
- err(2, "preadline");
+ line = malloc(rlen + 1);
+ if (line == NULL)
+ return NULL;
+ if ((nr = pread(fd, line, rlen, off)) < 0) {
+ free(line);
+ return NULL;
+ }
if (nr > 0 && line[nr-1] == '\n')
nr--;
line[nr] = '\0';
* lines appended (beginning at b). If c is greater than d then there are
* lines missing from the to file.
*/
-static void
+static int
change(FILE *outfile, struct got_diff_state *ds, struct got_diff_args *args,
const char *file1, FILE *f1, const char *file2, FILE *f2,
int a, int b, int c, int d, int *pflags)
restart:
if (args->diff_format != D_IFDEF && a > b && c > d)
- return;
+ return (0);
if (args->ignore_pats != NULL) {
char *line;
/*
if (a <= b) { /* Changes and deletes. */
for (i = a; i <= b; i++) {
line = preadline(fileno(f1),
- ds->ixold[i] - ds->ixold[i - 1], ds->ixold[i - 1]);
+ ds->ixold[i] - ds->ixold[i - 1],
+ ds->ixold[i - 1]);
+ if (line == NULL)
+ return (-1);
if (!ignoreline(line))
goto proceed;
}
if (a > b || c <= d) { /* Changes and inserts. */
for (i = c; i <= d; i++) {
line = preadline(fileno(f2),
- ds->ixnew[i] - ds->ixnew[i - 1], ds->ixnew[i - 1]);
+ ds->ixnew[i] - ds->ixnew[i - 1],
+ ds->ixnew[i - 1]);
+ if (line == NULL)
+ return (-1);
if (!ignoreline(line))
goto proceed;
}
}
- return;
+ return (0);
}
proceed:
if (*pflags & D_HEADER) {
if (ds->context_vec_ptr == ds->context_vec_end - 1) {
ptrdiff_t offset = ds->context_vec_ptr - ds->context_vec_start;
max_context <<= 1;
- ds->context_vec_start = xreallocarray(ds->context_vec_start,
- max_context, sizeof(*ds->context_vec_start));
+ ds->context_vec_start =
+ reallocarray(ds->context_vec_start, max_context,
+ sizeof(*ds->context_vec_start));
+ if (ds->context_vec_start == NULL)
+ return (-1);
ds->context_vec_end = ds->context_vec_start + max_context;
ds->context_vec_ptr = ds->context_vec_start + offset;
}
ds->context_vec_ptr->b = b;
ds->context_vec_ptr->c = c;
ds->context_vec_ptr->d = d;
- return;
+ return (0);
}
if (ds->anychange == 0)
ds->anychange = 1;
switch (args->diff_format) {
case D_BRIEF:
- return;
+ return (0);
case D_NORMAL:
case D_EDIT:
range(outfile, a, b, ",");
diff_output(outfile, "#endif /* %s */\n", args->ifdefname);
ds->inifdef = 0;
}
+
+ return (0);
}
static int
blob - a17c3fe57836630c02583d0129e06856e1916187 (mode 644)
blob + /dev/null
--- lib/xmalloc.c
+++ /dev/null
-/* $OpenBSD: xmalloc.c,v 1.9 2015/11/17 18:25:02 tobias Exp $ */
-/*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- * All rights reserved
- * Versions of malloc and friends that check their results, and never return
- * failure (they call fatal if they encounter an error).
- *
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose. Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
- */
-
-#include <err.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "xmalloc.h"
-
-void *
-xmalloc(size_t size)
-{
- void *ptr;
-
- if (size == 0)
- errx(2, "xmalloc: zero size");
- ptr = malloc(size);
- if (ptr == NULL)
- err(2, "xmalloc: allocating %zu bytes", size);
- return ptr;
-}
-
-void *
-xcalloc(size_t nmemb, size_t size)
-{
- void *ptr;
-
- ptr = calloc(nmemb, size);
- if (ptr == NULL)
- err(2, "xcalloc: allocating %zu * %zu bytes", nmemb, size);
- return ptr;
-}
-
-void *
-xreallocarray(void *ptr, size_t nmemb, size_t size)
-{
- void *new_ptr;
-
- new_ptr = reallocarray(ptr, nmemb, size);
- if (new_ptr == NULL)
- err(2, "xreallocarray: allocating %zu * %zu bytes",
- nmemb, size);
- return new_ptr;
-}
-
-char *
-xstrdup(const char *str)
-{
- char *cp;
-
- if ((cp = strdup(str)) == NULL)
- err(2, "xstrdup");
- return cp;
-}
-
-int
-xasprintf(char **ret, const char *fmt, ...)
-{
- va_list ap;
- int i;
-
- va_start(ap, fmt);
- i = vasprintf(ret, fmt, ap);
- va_end(ap);
-
- if (i < 0 || *ret == NULL)
- err(2, "xasprintf");
-
- return i;
-}
blob - 21396717fa48bb203491bf42581b774c626f1c8c (mode 644)
blob + /dev/null
--- lib/xmalloc.h
+++ /dev/null
-/* $OpenBSD: xmalloc.h,v 1.4 2015/11/12 16:30:30 mmcc Exp $ */
-
-/*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- * All rights reserved
- * Created: Mon Mar 20 22:09:17 1995 ylo
- *
- * Versions of malloc and friends that check their results, and never return
- * failure (they call fatal if they encounter an error).
- *
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose. Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
- */
-
-#ifndef XMALLOC_H
-#define XMALLOC_H
-
-void *xmalloc(size_t);
-void *xcalloc(size_t, size_t);
-void *xreallocarray(void *, size_t, size_t);
-char *xstrdup(const char *);
-int xasprintf(char **, const char *, ...)
- __attribute__((__format__ (printf, 2, 3)))
- __attribute__((__nonnull__ (2)));
-
-#endif /* XMALLOC_H */
blob - c506dc70c054f39ca5b85a1a9b63d7ad956368d3
blob + ca55e0e5b22d644c5ad5e9f51a79b3d66fbd41b9
--- regress/repository/Makefile
+++ regress/repository/Makefile
PROG = repository_test
SRCS = path.c repository.c error.c refs.c object.c sha1.c diff.c \
- diffreg.c xmalloc.c pack.c delta.c repository_test.c
+ diffreg.c pack.c delta.c repository_test.c
CPPFLAGS = -I${.CURDIR}/../../include
LDADD = -lutil -lz