Why not just set errno to 0 in the success case?

On 04/13/17 17:05, Oriol Arcas wrote:
> Fixes bug #2921.
> 
> During odp_shm_reserve() mmap is tried with huge pages, and if it fails,
> without huge pages. The first call leaves errno set, which can confuse
> the client app.
> 
> In general, errno must be cleared before calling any library call known
> to set it (see SEI CERT rule ERR30-C).
> 
> Signed-off-by: Oriol Arcas <or...@starflownetworks.com>
> ---
>  platform/linux-generic/_ishmphy.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/platform/linux-generic/_ishmphy.c 
> b/platform/linux-generic/_ishmphy.c
> index d519af6..87c33ef 100644
> --- a/platform/linux-generic/_ishmphy.c
> +++ b/platform/linux-generic/_ishmphy.c
> @@ -121,10 +121,12 @@ void *_odp_ishmphy_map(int fd, void *start, uint64_t 
> size,
>                * The initial free maping can then be removed.
>                */
>               mapped_addr = MAP_FAILED;
> +             errno = 0;
>               mapped_addr_tmp = mmap(NULL, size, PROT_READ | PROT_WRITE,
>                                      MAP_SHARED | mmap_flags, fd, 0);
>               if (mapped_addr_tmp != MAP_FAILED) {
>                       /* If OK, do new map at right fixed location... */
> +                     errno = 0;
>                       mapped_addr = mmap(start,
>                                          size, PROT_READ | PROT_WRITE,
>                                          MAP_SHARED | MAP_FIXED | mmap_flags,
> @@ -132,11 +134,13 @@ void *_odp_ishmphy_map(int fd, void *start, uint64_t 
> size,
>                       if (mapped_addr != start)
>                               ODP_ERR("new map failed:%s\n", strerror(errno));
>                       /* ... and remove initial mapping: */
> +                     errno = 0;
>                       if (munmap(mapped_addr_tmp, size))
>                               ODP_ERR("munmap failed:%s\n", strerror(errno));
>               }
>       } else {
>               /* just do a new mapping in the VA space: */
> +             errno = 0;
>               mapped_addr = mmap(NULL, size, PROT_READ | PROT_WRITE,
>                                  MAP_SHARED | mmap_flags, fd, 0);
>               if ((mapped_addr >= common_va_address) &&
> @@ -154,6 +158,7 @@ void *_odp_ishmphy_map(int fd, void *start, uint64_t size,
>       /* if locking is requested, lock it...*/
>       if (flags & _ODP_ISHM_LOCK) {
>               if (mlock(mapped_addr, size)) {
> +                     errno = 0;
>                       if (munmap(mapped_addr, size))
>                               ODP_ERR("munmap failed:%s\n", strerror(errno));
>                       ODP_ERR("mlock failed:%s\n", strerror(errno));
> 

Reply via email to