DIR-CREATETIME regression.

Jeremy Allison jra at samba.org
Wed Jul 28 09:16:05 MDT 2010


Volker, hate to tell you but the regression in DIR-CREATETIME
in "make test" seems to have been caused by this patch series.

The server code hasn't changed here, so I think it's the
changes in cli_qpathinfo2.

I'm still investigating...

Jeremy.

On Sun, Jul 25, 2010 at 03:30:24PM -0500, Volker Lendecke wrote:
> The branch, master has been updated
>        via  334d5bf... s3: Convert cli_get_ea_list_path to cli_qpathinfo_send
>        via  5380f67... s3: Factor out parse_ea_blob
>        via  d5e285a... s3: Convert cli_posix_stat to cli_qpathinfo_send
>        via  786e4cd... s3: Convert cli_posix_getfacl to cli_qpathinfo_send
>        via  cb9baa7... s3: Convert cli_posix_readlink to cli_qpathinfo_send
>        via  535774d... s3: Add async cli_qpathinfo
>        via  ce3dfd7... s3: cli_qpathinfo->cli_qpathinfo1
>       from  b04eba1... s3: Fix cli_posix_stat
> 
> http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
> 
> 
> - Log -----------------------------------------------------------------
> commit 334d5bfe30188a42af758db3f6a3551dd074900a
> Author: Volker Lendecke <vl at samba.org>
> Date:   Sun Jul 25 21:32:13 2010 +0200
> 
>     s3: Convert cli_get_ea_list_path to cli_qpathinfo_send
> 
> commit 5380f67730154d872ad21a3d9908cfc2bb91edbd
> Author: Volker Lendecke <vl at samba.org>
> Date:   Sun Jul 25 19:42:22 2010 +0200
> 
>     s3: Factor out parse_ea_blob
> 
> commit d5e285abae34339f6eabc54a17049dcc5b56a6b0
> Author: Volker Lendecke <vl at samba.org>
> Date:   Sun Jul 25 17:49:20 2010 +0200
> 
>     s3: Convert cli_posix_stat to cli_qpathinfo_send
> 
> commit 786e4cd0980f0562b28ac74612a72faa4e2050cc
> Author: Volker Lendecke <vl at samba.org>
> Date:   Sun Jul 25 17:46:01 2010 +0200
> 
>     s3: Convert cli_posix_getfacl to cli_qpathinfo_send
> 
> commit cb9baa7c2c6edafd835bc6e36a385b0d00f5277e
> Author: Volker Lendecke <vl at samba.org>
> Date:   Sun Jul 25 17:37:16 2010 +0200
> 
>     s3: Convert cli_posix_readlink to cli_qpathinfo_send
> 
> commit 535774d88068052accedb21b626fd97a79502c0e
> Author: Volker Lendecke <vl at samba.org>
> Date:   Sun Jul 25 17:26:43 2010 +0200
> 
>     s3: Add async cli_qpathinfo
> 
> commit ce3dfd777f8f2da4cb08f6c91a465e647b84a8f1
> Author: Volker Lendecke <vl at samba.org>
> Date:   Sun Jul 25 13:19:34 2010 +0200
> 
>     s3: cli_qpathinfo->cli_qpathinfo1
> 
> -----------------------------------------------------------------------
> 
> Summary of changes:
>  source3/include/proto.h   |   21 ++-
>  source3/libsmb/clifile.c  |  566 +++++++++++++++++++++++++++------------------
>  source3/libsmb/clirap.c   |    2 +-
>  source3/torture/nbio.c    |    2 +-
>  source3/torture/torture.c |   19 +-
>  5 files changed, 376 insertions(+), 234 deletions(-)
> 
> 
> Changeset truncated at 500 lines:
> 
> diff --git a/source3/include/proto.h b/source3/include/proto.h
> index 75e4aaf..3759a78 100644
> --- a/source3/include/proto.h
> +++ b/source3/include/proto.h
> @@ -2466,7 +2466,13 @@ NTSTATUS cli_ctemp(struct cli_state *cli,
>  NTSTATUS cli_raw_ioctl(struct cli_state *cli, uint16_t fnum, uint32_t code, DATA_BLOB *blob);
>  bool cli_set_ea_path(struct cli_state *cli, const char *path, const char *ea_name, const char *ea_val, size_t ea_len);
>  bool cli_set_ea_fnum(struct cli_state *cli, uint16_t fnum, const char *ea_name, const char *ea_val, size_t ea_len);
> -bool cli_get_ea_list_path(struct cli_state *cli, const char *path,
> +struct tevent_req *cli_get_ea_list_path_send(TALLOC_CTX *mem_ctx,
> +					     struct tevent_context *ev,
> +					     struct cli_state *cli,
> +					     const char *fname);
> +NTSTATUS cli_get_ea_list_path_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> +				   size_t *pnum_eas, struct ea_struct **peas);
> +NTSTATUS cli_get_ea_list_path(struct cli_state *cli, const char *path,
>  		TALLOC_CTX *ctx,
>  		size_t *pnum_eas,
>  		struct ea_struct **pea_list);
> @@ -2636,7 +2642,7 @@ bool cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,
>  		       void *state);
>  bool cli_oem_change_password(struct cli_state *cli, const char *user, const char *new_password,
>                               const char *old_password);
> -bool cli_qpathinfo(struct cli_state *cli,
> +bool cli_qpathinfo1(struct cli_state *cli,
>  			const char *fname,
>  			time_t *change_time,
>  			time_t *access_time,
> @@ -2672,6 +2678,17 @@ NTSTATUS cli_qpathinfo_basic(struct cli_state *cli, const char *name,
>  			     SMB_STRUCT_STAT *sbuf, uint32 *attributes);
>  bool cli_qfileinfo_test(struct cli_state *cli, uint16_t fnum, int level, char **poutdata, uint32 *poutlen);
>  NTSTATUS cli_qpathinfo_alt_name(struct cli_state *cli, const char *fname, fstring alt_name);
> +struct tevent_req *cli_qpathinfo_send(TALLOC_CTX *mem_ctx,
> +				      struct tevent_context *ev,
> +				      struct cli_state *cli, const char *fname,
> +				      uint16_t level, uint32_t min_rdata,
> +				      uint32_t max_rdata);
> +NTSTATUS cli_qpathinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> +			    uint8_t **rdata, uint32_t *num_rdata);
> +NTSTATUS cli_qpathinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
> +		       const char *fname, uint16_t level, uint32_t min_rdata,
> +		       uint32_t max_rdata,
> +		       uint8_t **rdata, uint32_t *num_rdata);
>  
>  /* The following definitions come from libsmb/clirap2.c  */
>  struct rap_group_info_1;
> diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
> index de2d185..3198123 100644
> --- a/source3/libsmb/clifile.c
> +++ b/source3/libsmb/clifile.c
> @@ -273,30 +273,7 @@ struct readlink_state {
>  	uint32_t num_data;
>  };
>  
> -static void cli_posix_readlink_done(struct tevent_req *subreq)
> -{
> -	struct tevent_req *req = tevent_req_callback_data(
> -				subreq, struct tevent_req);
> -	struct readlink_state *state = tevent_req_data(req, struct readlink_state);
> -	NTSTATUS status;
> -
> -	status = cli_trans_recv(subreq, state, NULL, 0, NULL, NULL, 0, NULL,
> -				&state->data, 0, &state->num_data);
> -	TALLOC_FREE(subreq);
> -	if (!NT_STATUS_IS_OK(status)) {
> -		tevent_req_nterror(req, status);
> -		return;
> -	}
> -	if (state->num_data == 0) {
> -		tevent_req_nterror(req, NT_STATUS_DATA_ERROR);
> -		return;
> -	}
> -	if (state->data[state->num_data-1] != '\0') {
> -		tevent_req_nterror(req, NT_STATUS_DATA_ERROR);
> -		return;
> -	}
> -	tevent_req_done(req);
> -}
> +static void cli_posix_readlink_done(struct tevent_req *subreq);
>  
>  struct tevent_req *cli_posix_readlink_send(TALLOC_CTX *mem_ctx,
>  					struct event_context *ev,
> @@ -308,51 +285,21 @@ struct tevent_req *cli_posix_readlink_send(TALLOC_CTX *mem_ctx,
>  	struct readlink_state *state = NULL;
>  	uint32_t maxbytelen = (uint32_t)(cli_ucs2(cli) ? len*3 : len);
>  
> -	if (maxbytelen < len) {
> -		return NULL;
> -	}
> -
>  	req = tevent_req_create(mem_ctx, &state, struct readlink_state);
>  	if (req == NULL) {
>  		return NULL;
>  	}
>  
> -	/* Setup setup word. */
> -	SSVAL(&state->setup, 0, TRANSACT2_QPATHINFO);
> -
> -	/* Setup param array. */
> -	state->param = talloc_array(state, uint8_t, 6);
> -	if (tevent_req_nomem(state->param, req)) {
> -		return tevent_req_post(req, ev);
> -	}
> -	memset(state->param, '\0', 6);
> -	SSVAL(state->param,0,SMB_QUERY_FILE_UNIX_LINK);
> -
> -	state->param = trans2_bytes_push_str(state->param, cli_ucs2(cli), fname,
> -				   strlen(fname)+1, NULL);
> -
> -	if (tevent_req_nomem(state->param, req)) {
> +	/*
> +	 * Len is in bytes, we need it in UCS2 units.
> +	 */
> +	if ((2*len < len) || (maxbytelen < len)) {
> +		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
>  		return tevent_req_post(req, ev);
>  	}
>  
> -	subreq = cli_trans_send(state,			/* mem ctx. */
> -				ev,			/* event ctx. */
> -				cli,			/* cli_state. */
> -				SMBtrans2,		/* cmd. */
> -				NULL,			/* pipe name. */
> -				-1,			/* fid. */
> -				0,			/* function. */
> -				0,			/* flags. */
> -				&state->setup,		/* setup. */
> -				1,			/* num setup uint16_t words. */
> -				0,			/* max returned setup. */
> -				state->param,		/* param. */
> -				talloc_get_size(state->param),	/* num param. */
> -				2,			/* max returned param. */
> -				NULL,			/* data. */
> -				0,			/* num data. */
> -				maxbytelen);		/* max returned data. */
> -
> +	subreq = cli_qpathinfo_send(state, ev, cli, fname,
> +				    SMB_QUERY_FILE_UNIX_LINK, 1, maxbytelen);
>  	if (tevent_req_nomem(subreq, req)) {
>  		return tevent_req_post(req, ev);
>  	}
> @@ -360,6 +307,31 @@ struct tevent_req *cli_posix_readlink_send(TALLOC_CTX *mem_ctx,
>  	return req;
>  }
>  
> +static void cli_posix_readlink_done(struct tevent_req *subreq)
> +{
> +	struct tevent_req *req = tevent_req_callback_data(
> +		subreq, struct tevent_req);
> +	struct readlink_state *state = tevent_req_data(
> +		req, struct readlink_state);
> +	NTSTATUS status;
> +
> +	status = cli_qpathinfo_recv(subreq, state, &state->data,
> +				    &state->num_data);
> +	TALLOC_FREE(subreq);
> +	if (!NT_STATUS_IS_OK(status)) {
> +		tevent_req_nterror(req, status);
> +		return;
> +	}
> +	/*
> +	 * num_data is > 1, we've given 1 as minimum to cli_qpathinfo_send
> +	 */
> +	if (state->data[state->num_data-1] != '\0') {
> +		tevent_req_nterror(req, NT_STATUS_DATA_ERROR);
> +		return;
> +	}
> +	tevent_req_done(req);
> +}
> +
>  NTSTATUS cli_posix_readlink_recv(struct tevent_req *req, struct cli_state *cli,
>  				char *retpath, size_t len)
>  {
> @@ -413,12 +385,6 @@ NTSTATUS cli_posix_readlink(struct cli_state *cli, const char *fname,
>  		goto fail;
>  	}
>  
> -	/* Len is in bytes, we need it in UCS2 units. */
> -	if (2*len < len) {
> -		status = NT_STATUS_INVALID_PARAMETER;
> -		goto fail;
> -	}
> -
>  	req = cli_posix_readlink_send(frame,
>  				ev,
>  				cli,
> @@ -621,22 +587,7 @@ struct getfacl_state {
>  	uint8_t *data;
>  };
>  
> -static void cli_posix_getfacl_done(struct tevent_req *subreq)
> -{
> -	struct tevent_req *req = tevent_req_callback_data(
> -				subreq, struct tevent_req);
> -	struct getfacl_state *state = tevent_req_data(req, struct getfacl_state);
> -	NTSTATUS status;
> -
> -	status = cli_trans_recv(subreq, state, NULL, 0, NULL, NULL, 0, NULL,
> -				&state->data, 0, &state->num_data);
> -	TALLOC_FREE(subreq);
> -	if (!NT_STATUS_IS_OK(status)) {
> -		tevent_req_nterror(req, status);
> -		return;
> -	}
> -	tevent_req_done(req);
> -}
> +static void cli_posix_getfacl_done(struct tevent_req *subreq);
>  
>  struct tevent_req *cli_posix_getfacl_send(TALLOC_CTX *mem_ctx,
>  					struct event_context *ev,
> @@ -650,43 +601,8 @@ struct tevent_req *cli_posix_getfacl_send(TALLOC_CTX *mem_ctx,
>  	if (req == NULL) {
>  		return NULL;
>  	}
> -
> -	/* Setup setup word. */
> -	SSVAL(&state->setup, 0, TRANSACT2_QPATHINFO);
> -
> -	/* Setup param array. */
> -	state->param = talloc_array(state, uint8_t, 6);
> -	if (tevent_req_nomem(state->param, req)) {
> -		return tevent_req_post(req, ev);
> -	}
> -	memset(state->param, '\0', 6);
> -	SSVAL(state->param, 0, SMB_QUERY_POSIX_ACL);
> -
> -	state->param = trans2_bytes_push_str(state->param, cli_ucs2(cli), fname,
> -				   strlen(fname)+1, NULL);
> -
> -	if (tevent_req_nomem(state->param, req)) {
> -		return tevent_req_post(req, ev);
> -	}
> -
> -	subreq = cli_trans_send(state,			/* mem ctx. */
> -				ev,			/* event ctx. */
> -				cli,			/* cli_state. */
> -				SMBtrans2,		/* cmd. */
> -				NULL,			/* pipe name. */
> -				-1,			/* fid. */
> -				0,			/* function. */
> -				0,			/* flags. */
> -				&state->setup,		/* setup. */
> -				1,			/* num setup uint16_t words. */
> -				0,			/* max returned setup. */
> -				state->param,		/* param. */
> -				talloc_get_size(state->param),	/* num param. */
> -				2,			/* max returned param. */
> -				NULL,			/* data. */
> -				0,			/* num data. */
> -				cli->max_xmit);		/* max returned data. */
> -
> +	subreq = cli_qpathinfo_send(state, ev, cli, fname, SMB_QUERY_POSIX_ACL,
> +				    0, cli->max_xmit);
>  	if (tevent_req_nomem(subreq, req)) {
>  		return tevent_req_post(req, ev);
>  	}
> @@ -694,6 +610,24 @@ struct tevent_req *cli_posix_getfacl_send(TALLOC_CTX *mem_ctx,
>  	return req;
>  }
>  
> +static void cli_posix_getfacl_done(struct tevent_req *subreq)
> +{
> +	struct tevent_req *req = tevent_req_callback_data(
> +		subreq, struct tevent_req);
> +	struct getfacl_state *state = tevent_req_data(
> +		req, struct getfacl_state);
> +	NTSTATUS status;
> +
> +	status = cli_qpathinfo_recv(subreq, state, &state->data,
> +				    &state->num_data);
> +	TALLOC_FREE(subreq);
> +	if (!NT_STATUS_IS_OK(status)) {
> +		tevent_req_nterror(req, status);
> +		return;
> +	}
> +	tevent_req_done(req);
> +}
> +
>  NTSTATUS cli_posix_getfacl_recv(struct tevent_req *req,
>  				TALLOC_CTX *mem_ctx,
>  				size_t *prb_size,
> @@ -770,22 +704,7 @@ struct stat_state {
>  	uint8_t *data;
>  };
>  
> -static void cli_posix_stat_done(struct tevent_req *subreq)
> -{
> -	struct tevent_req *req = tevent_req_callback_data(
> -				subreq, struct tevent_req);
> -	struct stat_state *state = tevent_req_data(req, struct stat_state);
> -	NTSTATUS status;
> -
> -	status = cli_trans_recv(subreq, state, NULL, 0, NULL, NULL, 0, NULL,
> -				&state->data, 100, &state->num_data);
> -	TALLOC_FREE(subreq);
> -	if (!NT_STATUS_IS_OK(status)) {
> -		tevent_req_nterror(req, status);
> -		return;
> -	}
> -	tevent_req_done(req);
> -}
> +static void cli_posix_stat_done(struct tevent_req *subreq);
>  
>  struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx,
>  					struct event_context *ev,
> @@ -799,43 +718,8 @@ struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx,
>  	if (req == NULL) {
>  		return NULL;
>  	}
> -
> -	/* Setup setup word. */
> -	SSVAL(&state->setup, 0, TRANSACT2_QPATHINFO);
> -
> -	/* Setup param array. */
> -	state->param = talloc_array(state, uint8_t, 6);
> -	if (tevent_req_nomem(state->param, req)) {
> -		return tevent_req_post(req, ev);
> -	}
> -	memset(state->param, '\0', 6);
> -	SSVAL(state->param, 0, SMB_QUERY_FILE_UNIX_BASIC);
> -
> -	state->param = trans2_bytes_push_str(state->param, cli_ucs2(cli), fname,
> -				   strlen(fname)+1, NULL);
> -
> -	if (tevent_req_nomem(state->param, req)) {
> -		return tevent_req_post(req, ev);
> -	}
> -
> -	subreq = cli_trans_send(state,			/* mem ctx. */
> -				ev,			/* event ctx. */
> -				cli,			/* cli_state. */
> -				SMBtrans2,		/* cmd. */
> -				NULL,			/* pipe name. */
> -				-1,			/* fid. */
> -				0,			/* function. */
> -				0,			/* flags. */
> -				&state->setup,		/* setup. */
> -				1,			/* num setup uint16_t words. */
> -				0,			/* max returned setup. */
> -				state->param,		/* param. */
> -				talloc_get_size(state->param),	/* num param. */
> -				2,			/* max returned param. */
> -				NULL,			/* data. */
> -				0,			/* num data. */
> -				100);			/* max returned data. */
> -
> +	subreq = cli_qpathinfo_send(state, ev, cli, fname,
> +				    SMB_QUERY_FILE_UNIX_BASIC, 100, 100);
>  	if (tevent_req_nomem(subreq, req)) {
>  		return tevent_req_post(req, ev);
>  	}
> @@ -843,6 +727,23 @@ struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx,
>  	return req;
>  }
>  
> +static void cli_posix_stat_done(struct tevent_req *subreq)
> +{
> +	struct tevent_req *req = tevent_req_callback_data(
> +				subreq, struct tevent_req);
> +	struct stat_state *state = tevent_req_data(req, struct stat_state);
> +	NTSTATUS status;
> +
> +	status = cli_qpathinfo_recv(subreq, state, &state->data,
> +				    &state->num_data);
> +	TALLOC_FREE(subreq);
> +	if (!NT_STATUS_IS_OK(status)) {
> +		tevent_req_nterror(req, status);
> +		return;
> +	}
> +	tevent_req_done(req);
> +}
> +
>  NTSTATUS cli_posix_stat_recv(struct tevent_req *req,
>  				SMB_STRUCT_STAT *sbuf)
>  {
> @@ -853,10 +754,6 @@ NTSTATUS cli_posix_stat_recv(struct tevent_req *req,
>  		return status;
>  	}
>  
> -	if (state->num_data != 100) {
> -		return NT_STATUS_DATA_ERROR;
> -	}
> -
>  	sbuf->st_ex_size = IVAL2_TO_SMB_BIG_UINT(state->data,0);     /* total size, in bytes */
>  	sbuf->st_ex_blocks = IVAL2_TO_SMB_BIG_UINT(state->data,8);   /* number of blocks allocated */
>  #if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE)
> @@ -4291,6 +4188,10 @@ bool cli_set_ea_fnum(struct cli_state *cli, uint16_t fnum, const char *ea_name,
>   Get an extended attribute list utility fn.
>  *********************************************************/
>  
> +static bool parse_ea_blob(TALLOC_CTX *mem_ctx, const uint8_t *rdata,
> +			  size_t rdata_len,
> +			  size_t *pnum_eas, struct ea_struct **pea_list);
> +
>  static bool cli_get_ea_list(struct cli_state *cli,
>  		uint16_t setup, char *param, unsigned int param_len,
>  		TALLOC_CTX *ctx,
> @@ -4300,11 +4201,7 @@ static bool cli_get_ea_list(struct cli_state *cli,
>  	unsigned int data_len = 0;
>  	unsigned int rparam_len, rdata_len;
>  	char *rparam=NULL, *rdata=NULL;
> -	char *p;
> -	size_t ea_size;
> -	size_t num_eas;
>  	bool ret = False;
> -	struct ea_struct *ea_list;
>  
>  	*pnum_eas = 0;
>  	if (pea_list) {
> @@ -4327,19 +4224,35 @@ static bool cli_get_ea_list(struct cli_state *cli,
>  		return False;
>  	}
>  
> -	if (!rdata || rdata_len < 4) {
> -		goto out;
> +	ret = parse_ea_blob(ctx, (uint8_t *)rdata, rdata_len, pnum_eas,
> +			    pea_list);
> +	SAFE_FREE(rparam);
> +	SAFE_FREE(rdata);
> +	return ret;
> +}
> +
> +static bool parse_ea_blob(TALLOC_CTX *ctx, const uint8_t *rdata,
> +			  size_t rdata_len,
> +			  size_t *pnum_eas, struct ea_struct **pea_list)
> +{
> +	struct ea_struct *ea_list = NULL;
> +	size_t num_eas;
> +	size_t ea_size;
> +	const uint8_t *p;
> +
> +	if (rdata_len < 4) {
> +		return false;
>  	}
>  
>  	ea_size = (size_t)IVAL(rdata,0);
>  	if (ea_size > rdata_len) {
> -		goto out;
> +		return false;
>  	}
>  
>  	if (ea_size == 0) {
>  		/* No EA's present. */
> -		ret = True;
> -		goto out;
> +		*pnum_eas = 0;
> +		return true;
>  	}
>  
>  	p = rdata + 4;
> @@ -4350,30 +4263,29 @@ static bool cli_get_ea_list(struct cli_state *cli,
>  		unsigned int ea_namelen = CVAL(p,1);
>  		unsigned int ea_valuelen = SVAL(p,2);
>  		if (ea_namelen == 0) {
> -			goto out;
> +			return false;
>  		}
>  		if (4 + ea_namelen + 1 + ea_valuelen > ea_size) {
> -			goto out;
> +			return false;
>  		}
>  		ea_size -= 4 + ea_namelen + 1 + ea_valuelen;
>  		p += 4 + ea_namelen + 1 + ea_valuelen;
>  	}
>  
>  	if (num_eas == 0) {
> -		ret = True;
> -		goto out;
> +		*pnum_eas = 0;
> +		return true;
>  	}
>  
>  	*pnum_eas = num_eas;
>  	if (!pea_list) {
>  		/* Caller only wants number of EA's. */
> -		ret = True;
> -		goto out;
> +		return true;
>  	}
>  
>  	ea_list = TALLOC_ARRAY(ctx, struct ea_struct, num_eas);
>  	if (!ea_list) {
> -		goto out;
> +		return false;
>  	}
>  
>  	ea_size = (size_t)IVAL(rdata,0);
> @@ -4388,11 +4300,14 @@ static bool cli_get_ea_list(struct cli_state *cli,
>  		ea->flags = CVAL(p,0);
>  		unix_ea_name[0] = '\0';
>  		pull_ascii_fstring(unix_ea_name, p + 4);
> -		ea->name = talloc_strdup(ctx, unix_ea_name);
> +		ea->name = talloc_strdup(ea_list, unix_ea_name);
> +		if (!ea->name) {
> +			goto fail;
> +		}
>  		/* Ensure the value is null terminated (in case it's a string). */
> -		ea->value = data_blob_talloc(ctx, NULL, ea_valuelen + 1);
> +		ea->value = data_blob_talloc(ea_list, NULL, ea_valuelen + 1);
>  		if (!ea->value.data) {
> 
> 
> -- 
> Samba Shared Repository


More information about the samba-technical mailing list