When trying to put an object into a bucket without permissions, Amazon S3 throws at you a 403 Forbidden error. But s3cmd assumes it's some kind of communication error and enters the "retry loop". Of course it always fails because nothing changes in the permissions between tries. Not even in DEBUG mode I could get anything related to HTTP 403 error, or "forbidden" or "acces denied" or anything like that. I had to disable SSL and sniff the traffic with tcpdump, then analise it with wireshark, to see the real error (which was really easy to fix, once I knew what was going on). The best clue I could get from s3cmd was "broken pipe". I guess that exception handling could be improved a little bit in send_file ;)
For greater confusion, s3cmd sends the HTTP headers and begins sending data and showing progress, before receiving the 403 error and interpreting it's some other error.