Edit

IABSD.fr/src/usr.bin/rsync/misc.c

Branch :

  • Show log

    Commit

  • Author : claudio
    Date : 2021-05-17 12:02:58
    Hash : dd3c9d24
    Message : Error out on memory failures in fargs_cmdline() and addargs() in both cases it was impossible to start the remote rsync anyway. Also now fargs_cmdline() can no longer fail. Add missing err(ERR_IPC, "pldege") for the cases in socket.c OK benno@

  • usr.bin/rsync/misc.c
  • /* $OpenBSD: misc.c,v 1.3 2021/05/17 12:02:58 claudio Exp $ */
    /*
     * Copyright (c) 2000 Markus Friedl.  All rights reserved.
     * Copyright (c) 2005,2006 Damien Miller.  All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     * 1. Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     * 2. Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdarg.h>
    #include <err.h>
    
    #include "extern.h"
    
    /* function to assist building execv() arguments */
    void
    addargs(arglist *args, const char *fmt, ...)
    {
    	va_list	 ap;
    	char	*cp;
    	u_int	 nalloc;
    	int	 r;
    
    	va_start(ap, fmt);
    	r = vasprintf(&cp, fmt, ap);
    	va_end(ap);
    	if (r == -1)
    		err(ERR_NOMEM, "addargs: argument too long");
    
    	nalloc = args->nalloc;
    	if (args->list == NULL) {
    		nalloc = 32;
    		args->num = 0;
    	} else if (args->num+2 >= nalloc)
    		nalloc *= 2;
    
    	args->list = recallocarray(args->list, args->nalloc, nalloc,
    	    sizeof(char *));
    	if (!args->list)
    		err(ERR_NOMEM, NULL);
    	args->nalloc = nalloc;
    	args->list[args->num++] = cp;
    	args->list[args->num] = NULL;
    }
    
    void
    freeargs(arglist *args)
    {
    	u_int i;
    
    	if (args->list != NULL) {
    		for (i = 0; i < args->num; i++)
    			free(args->list[i]);
    		free(args->list);
    		args->nalloc = args->num = 0;
    		args->list = NULL;
    	}
    }