Beispiel #1
0
/* strings of the permitgroup array */
static int
check_file_permissions(i_ctx_t *i_ctx_p, const char *fname, int len,
			const char *permitgroup)
{
    char fname_reduced[gp_file_name_sizeof];
    uint rlen = sizeof(fname_reduced);

    if (gp_file_name_reduce(fname, len, fname_reduced, &rlen) != gp_combine_success)
	return e_invalidaccess;		/* fail if we couldn't reduce */
    return check_file_permissions_reduced(i_ctx_p, fname_reduced, rlen, permitgroup);
}
Beispiel #2
0
/* return zero for success, -ve for error, +1 for continue */
static int
lib_file_open_search_with_no_combine(gs_file_path_ptr  lib_path, const gs_memory_t *mem, i_ctx_t *i_ctx_p,
                                     const char *fname, uint flen, char *buffer, int blen, uint *pclen, ref *pfile,
                                     gx_io_device *iodev, bool starting_arg_file, char *fmode)
{
    stream *s;
    uint blen1 = blen;
    if (gp_file_name_reduce(fname, flen, buffer, &blen1) != gp_combine_success)
      goto skip;
    if (iodev_os_open_file(iodev, (const char *)buffer, blen1,
                           (const char *)fmode, &s, (gs_memory_t *)mem) == 0) {
      if (starting_arg_file ||
          check_file_permissions_aux(i_ctx_p, buffer, blen1) >= 0) {
        *pclen = blen1;
        make_stream_file(pfile, s, "r");
        return 0;
      }
      sclose(s);
      return_error(e_invalidfileaccess);
    }
 skip:;
    return 1;
}
Beispiel #3
0
/* The startup code also calls this to open @-files. */
int
lib_file_open(gs_file_path_ptr  lib_path, const gs_memory_t *mem, i_ctx_t *i_ctx_p,      
		       const char *fname, uint flen, char *buffer, int blen, uint *pclen, ref *pfile)
{   /* i_ctx_p is NULL running arg (@) files. 
     * lib_path and mem are never NULL 
     */
    bool starting_arg_file = (i_ctx_p == NULL) ? true : i_ctx_p->starting_arg_file;
    bool search_with_no_combine = false;
    bool search_with_combine = false;
    char fmode[4] = { 'r', 0, 0, 0 };		/* room for binary suffix */
    stream *s;
    gx_io_device *iodev = iodev_default;

    /* when starting arg files (@ files) iodev_default is not yet set */
    if (iodev == 0)
        iodev = (gx_io_device *)gx_io_device_table[0];
    
    strcat(fmode, gp_fmode_binary_suffix);
    if (gp_file_name_is_absolute(fname, flen)) {
       search_with_no_combine = true;
       search_with_combine = false;
    } else {
       search_with_no_combine = starting_arg_file;
       search_with_combine = true;
    }
    if (search_with_no_combine) {
	uint blen1 = blen;

	if (gp_file_name_reduce(fname, flen, buffer, &blen1) != gp_combine_success)
	    goto skip;
	if (iodev_os_open_file(iodev, (const char *)buffer, blen1,
				(const char *)fmode, &s, (gs_memory_t *)mem) == 0) {
	    if (starting_arg_file ||
			check_file_permissions_aux(i_ctx_p, buffer, blen1) >= 0) {
		*pclen = blen1;
		make_stream_file(pfile, s, "r");
		return 0;
	    }
	    sclose(s);
	    return_error(e_invalidfileaccess);
	}
	skip:;
    } 
    if (search_with_combine) {
	const gs_file_path *pfpath = lib_path;
	uint pi;

	for (pi = 0; pi < r_size(&pfpath->list); ++pi) {
	    const ref *prdir = pfpath->list.value.refs + pi;
	    const char *pstr = (const char *)prdir->value.const_bytes;
	    uint plen = r_size(prdir), blen1 = blen;
    	    gs_parsed_file_name_t pname;
	    gp_file_name_combine_result r;

	    /* We need to concatenate and parse the file name here
	     * if this path has a %device% prefix.		*/
	    if (pstr[0] == '%') {
		int code;

		/* We concatenate directly since gp_file_name_combine_*
		 * rules are not correct for other devices such as %rom% */
		gs_parse_file_name(&pname, pstr, plen);
		memcpy(buffer, pname.fname, pname.len);
		memcpy(buffer+pname.len, fname, flen);
		code = pname.iodev->procs.open_file(pname.iodev, buffer, pname.len + flen, fmode,
					      &s, (gs_memory_t *)mem);
		if (code < 0)
		    continue;
		make_stream_file(pfile, s, "r");
		/* fill in the buffer with the device concatenated */
		memcpy(buffer, pstr, plen);
		memcpy(buffer+plen, fname, flen);
		*pclen = plen + flen;
		return 0;
	    } else {
		r = gp_file_name_combine(pstr, plen, 
			fname, flen, false, buffer, &blen1);
		if (r != gp_combine_success)
		    continue;
		if (iodev_os_open_file(iodev, (const char *)buffer, blen1, (const char *)fmode,
					&s, (gs_memory_t *)mem) == 0) {
		    if (starting_arg_file ||
			check_file_permissions_aux(i_ctx_p, buffer, blen1) >= 0) {
			*pclen = blen1;
			make_stream_file(pfile, s, "r");
			return 0;
		    }
		    sclose(s);
		    return_error(e_invalidfileaccess);
		}
	    }
	}
    }
    return_error(e_undefinedfilename);
}