On Fri, Nov 17, 2017 at 12:49 PM, Julien Cristau <jcris...@debian.org> wrote: > > Control: tags -1 moreinfo > > On Sat, Sep 23, 2017 at 23:48:54 +0200, Jose Gutierrez de la Concha wrote: > > > diff -Nru zeroc-ice-3.6.3/cpp/src/Ice/Instance.cpp zeroc-ice-3.6.4/cpp/src/Ice/Instance.cpp > > --- zeroc-ice-3.6.3/cpp/src/Ice/Instance.cpp 2016-10-05 14:59:08.000000000 +0000 > > +++ zeroc-ice-3.6.4/cpp/src/Ice/Instance.cpp 2017-09-07 18:12:55.000000000 +0000 > > @@ -1,6 +1,6 @@ > > // ********************************************************************** > > // > > -// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved. > > +// Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved. > > // > > // This copy of Ice is licensed to you under the terms described in the > > // ICE_LICENSE file included in this distribution. > > @@ -184,7 +184,6 @@ > > const InstancePtr _instance; > > }; > > > > - > > // > > // Timer specialization which supports the thread observer > > // > > @@ -1064,6 +1063,7 @@ > > _initData(initData), > > _messageSizeMax(0), > > _batchAutoFlushSize(0), > > + _classGraphDepthMax(0), > > _collectObjects(false), > > _implicitContext(0), > > _stringConverter(IceUtil::getProcessStringConverter()), > > @@ -1132,21 +1132,25 @@ > > string newUser = _initData.properties->getProperty("Ice.ChangeUser"); > > if(!newUser.empty()) > > { > > - errno = 0; > > - struct passwd* pw = getpwnam(newUser.c_str()); > > - if(!pw) > > + struct passwd pwbuf; > > + vector<char> buffer(4096); // 4KB initial buffer > > + struct passwd *pw; > > + int err = getpwnam_r(newUser.c_str(), &pwbuf, &buffer[0], buffer.size(), &pw); > > + while(err == ERANGE && buffer.size() < 1024 * 1024) // Limit buffer to 1MB > > { > > - if(errno) > > - { > > - SyscallException ex(__FILE__, __LINE__); > > - ex.error = getSystemErrno(); > > - throw ex; > > - } > > - else > > - { > > - InitializationException ex(__FILE__, __LINE__, "Unknown user account `" + newUser + "'"); > > - throw ex; > > - } > > + buffer.resize(buffer.size() * 2); > > + } > > + if(err != 0) > > + { > > + Ice::SyscallException ex(__FILE__, __LINE__); > > + ex.error = err; > > + throw ex; > > + } > > + else if(pw == 0) > > + { > > + InitializationException ex(__FILE__, __LINE__); > > + ex.reason ="unknown user account `" + newUser + "'"; > > + throw ex; > > } > > > > if(setgid(pw->pw_gid) == -1) > > That new loop looks broken. It seems the intention was to extend the > buffer until getpwnam_r was happy, but getpwnam_r is only ever called > with the initial 4k buffer?
Hi Julien You are right the loop is definitely broken, I patching this upstream and will include a debian patch in 3.6.4-2 @@ -1135,8 +1135,9 @@ IceInternal::Instance::Instance(const CommunicatorPtr& communicator, const Initi struct passwd pwbuf; vector<char> buffer(4096); // 4KB initial buffer struct passwd *pw; - int err = getpwnam_r(newUser.c_str(), &pwbuf, &buffer[0], buffer.size(), &pw); - while(err == ERANGE && buffer.size() < 1024 * 1024) // Limit buffer to 1MB + int err; + while((err = getpwnam_r(newUser.c_str(), &pwbuf, &buffer[0], buffer.size(), &pw)) == ERANGE && + buffer.size() < 1024 * 1024) // Limit buffer to 1MB { buffer.resize(buffer.size() * 2); } Should I close this bug now and open a new one after upload 3.6.4-2? > > > Cheers, > Julien