[PATCH] Fix bug #9130 - Certain xattrs cause Windows error 0x800700FF

David Disseldorp ddiss at suse.de
Thu Mar 28 08:44:40 MDT 2013


Hi Jeremy,

A few minor comments on the patches below...

On Wed, 27 Mar 2013 15:05:05 -0700
Jeremy Allison <jra at samba.org> wrote:

> Patchset for master that fixes copying files with
> extended attributes from Linux or Solaris onto Windows
> over SMB2.
> 
> You can read the details here:
> 
> https://bugzilla.samba.org/show_bug.cgi?id=9130
> 
> Fix has been confirmed by the OEM who reported
> it on both 4.0.x and 4.6.x platforms. Includes
> an enhancement to the SMB2 torture tests to
> test the change.
> 
> Please review and push so I can get the fix
> into release branches.

8f75904 Modify fill_ea_chained_buffer() to be able to do size calculation only, no marshalling.
  fill_ea_chained_buffer() continues to do pointer arithmetic based on
  the potentially NULL pdata. I'd prefer it to be split into a separate
  function.

96e1776 Fix bug #9130 - Certain xattrs cause Windows error 0x800700FF
  316 static NTSTATUS get_ea_list_from_file_path(
  ...
  352                 status = get_ea_value(mem_ctx, conn, fsp,
  353                                       fname, names[i],
  354                                       &listp->ea);
  355 
  356                 if (!NT_STATUS_IS_OK(status)) {
  357                         return status;
  358                 }
  359 
  360                 if (listp->ea.value.length == 0) {
  361                         /*
  362                          * We can never return a zero length EA.
  363                          * Windows reports the EA's as corrupted.
  364                          */
  365                         TALLOC_FREE(listp);
  366                         continue;
  367                 }

  AFAICT, listp should be used as the memory context for get_ea_value()
  to avoid leaking ea.value.data on continue.

4342bfc Fix bug #9130 - Certain xattrs cause Windows error 0x800700FF
  77 NTSTATUS pvfs_query_ea_list(struct pvfs_state *pvfs, TALLOC_CTX *mem_ctx,
  ...
   96         eas->num_eas = num_names;
   97         for (i=0;i<num_names;i++) {
   98                 int j;
   99                 eas->eas[i].flags = 0;
  100                 eas->eas[i].name.s = names[i].name.s;
  101                 eas->eas[i].value = data_blob(NULL, 0);
  102                 for (j=0;j<ealist->num_eas;j++) {
  103                         if (strcasecmp_m(eas->eas[i].name.s,
  104                                        ealist->eas[j].name) == 0) {
  105                                 if (ealist->eas[i].value.length == 0) {
  106                                         continue;
  107                                 }

  This doesn't look right, as the data_blob(NULL, 0) EA would remain in
  the array. num_eas should be disjoint from num_names, and calculated
  on the fly IIUC.

Cheers, David


More information about the samba-technical mailing list