From c754792a07d340c30128b2fd064a58b1f15623da Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Thu, 6 Aug 2015 18:35:05 -0700 Subject: Use unique_ptr and unique_fd to manager FDs. Clean up leaky file descriptors in uncrypt/uncrypt.cpp. Add unique_fd for open() and unique_file for fopen() to close FDs on destruction. Bug: 21496020 Change-Id: I0174db0de9d5f59cd43b44757b8ef0f5912c91a2 --- unique_fd.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 unique_fd.h (limited to 'unique_fd.h') diff --git a/unique_fd.h b/unique_fd.h new file mode 100644 index 000000000..98a7c7b67 --- /dev/null +++ b/unique_fd.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIQUE_FD_H +#define UNIQUE_FD_H + +#include + +#include + +class unique_fd { + public: + unique_fd(int fd) : fd_(fd) { } + + unique_fd(unique_fd&& uf) { + fd_ = uf.fd_; + uf.fd_ = -1; + } + + ~unique_fd() { + if (fd_ != -1) { + close(fd_); + } + } + + int get() { + return fd_; + } + + // Movable. + unique_fd& operator=(unique_fd&& uf) { + fd_ = uf.fd_; + uf.fd_ = -1; + return *this; + } + + explicit operator bool() const { + return fd_ != -1; + } + + private: + int fd_; + + // Non-copyable. + unique_fd(const unique_fd&) = delete; + unique_fd& operator=(const unique_fd&) = delete; +}; + +// Custom deleter for unique_file to avoid fclose(NULL). +struct safe_fclose { + void operator()(FILE *fp) const { + if (fp) { + fclose(fp); + }; + } +}; + +using unique_file = std::unique_ptr; + +#endif // UNIQUE_FD_H -- cgit v1.2.3