Re: write() _will_ fail on Mac OS X/XNU if nbytes > INT_MAX

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Junio,

Sorry for the delay. I've updated the patch to work as you suggested (I think).
It's attached.

Thank you,

  Filipe
  F


On Tue, Apr 9, 2013 at 3:50 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote:
> Filipe Cabecinhas <filcab@xxxxxxxxx> writes:
>
>>
>> Testing with dd bs=INT_MAX+1 count=1 also gets me an “Invalid
>> argument” error, while bs=INT_MAX will do what's expected.
>>
>> I have a preliminary patch that fixes it, but it may not be the
>> preferred way. The code is not ifdef'ed out and I'm doing the fix in
>> write_in_full(), while it may be preferred to do the fix in xwrite().
>>
>> A radar bug has been submitted to Apple about this, but I think git
>> could tolerate the bug while it isn't fixed, by working around it.
>>
>> Thank you,
>>
>>   Filipe
>>
>> diff --git a/wrapper.c b/wrapper.c
>> index bac59d2..474d760 100644
>> --- a/wrapper.c
>> +++ b/wrapper.c
>> @@ -187,7 +187,12 @@ ssize_t write_in_full(int fd, const void *buf, size_t count)
>>       ssize_t total = 0;
>>
>>       while (count > 0) {
>> -             ssize_t written = xwrite(fd, p, count);
>> +             ssize_t written = 0;
>> +        if (count >= INT_MAX)
>> +                     written = xwrite(fd, p, INT_MAX-1);
>> +        else
>> +                     written = xwrite(fd, p, count);
>
> I think it is better to fix it in much lower level of the stack, as
> other codepaths would call write(2), either thru xwrite() or
> directly.
>
> Ideally the fix should go to the lowest level, i.e. the write(2).  I
> do not care if it is done in the kernel or in the libc wrapping
> code; the above does not belong to our code (in an ideal world, that
> is).
>
> Otherwise you would have to patch everything in /usr/bin, no?
>
> But you do not live in an ideal world and neither do we.  I think
> the least ugly way may be to add compat/clipped-write.c that
> implements a loop like the above in a helper function:
>
>         ssize_t clipped_write(int, const void *, size_t);
>
> and have a
>
>         #ifdef NEED_CLIPPED_WRITE
>         #define write(x,y,z) clipped_write((x),(y),(z))
>         #endif
>
> in git-compat-util.h, or something.  Makefile needs to get adjusted
> to link with compat/clipped-write.o when NEED_CLIPPED_WRITE is
> defined as well.

Attachment: git-big-write-darwin.patch
Description: Binary data


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]