Print this page
NEX-9532 NDMP: readdir errors when file/directory has special characters
Reviewed by: Peer Dampmann <peer.dampmann@nexenta.com>
Reviewed by: Alexander Eremin <alexander.eremin@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-2911 NDMP logging should use syslog and is too chatty
        
*** 34,46 ****
--- 34,48 ----
   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGE.
   */
+ /* Copyright 2017 Nexenta Systems, Inc. All rights reserved. */
  
  /* This file contains all the door server code */
  
+ #include <syslog.h>
  #include <door.h>
  #include <alloca.h>
  #include <errno.h>
  #include <note.h>
  #include <libintl.h>
*** 66,92 ****
          int fd;
  
          (void) mutex_lock(&ndmp_doorsrv_mutex);
  
          if (ndmp_door_fildes != -1) {
!                 NDMP_LOG(LOG_DEBUG,
                      "ndmp_door_init: ndmpd service is already running.");
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (0);
          }
  
          if ((ndmp_door_fildes = door_create(ndmp_door_server,
              NULL, DOOR_UNREF)) < 0) {
!                 NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Could not create door.");
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (-1);
          }
  
          (void) unlink(NDMP_DOOR_SVC);
  
          if ((fd = creat(NDMP_DOOR_SVC, 0444)) < 0) {
!                 NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Can't create %s: %m.",
                      NDMP_DOOR_SVC);
                  (void) door_revoke(ndmp_door_fildes);
                  ndmp_door_fildes = -1;
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (-1);
--- 68,94 ----
          int fd;
  
          (void) mutex_lock(&ndmp_doorsrv_mutex);
  
          if (ndmp_door_fildes != -1) {
!                 syslog(LOG_ERR,
                      "ndmp_door_init: ndmpd service is already running.");
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (0);
          }
  
          if ((ndmp_door_fildes = door_create(ndmp_door_server,
              NULL, DOOR_UNREF)) < 0) {
!                 syslog(LOG_ERR, "ndmp_door_init: Could not create door.");
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (-1);
          }
  
          (void) unlink(NDMP_DOOR_SVC);
  
          if ((fd = creat(NDMP_DOOR_SVC, 0444)) < 0) {
!                 syslog(LOG_ERR, "ndmp_door_init: Can't create %s: %m.",
                      NDMP_DOOR_SVC);
                  (void) door_revoke(ndmp_door_fildes);
                  ndmp_door_fildes = -1;
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (-1);
*** 94,111 ****
  
          (void) close(fd);
          (void) fdetach(NDMP_DOOR_SVC);
  
          if (fattach(ndmp_door_fildes, NDMP_DOOR_SVC) < 0) {
!                 NDMP_LOG(LOG_DEBUG, "ndmp_door_init: fattach failed %m");
                  (void) door_revoke(ndmp_door_fildes);
                  ndmp_door_fildes = -1;
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (-1);
          }
  
!         NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Door server successfully started");
          (void) mutex_unlock(&ndmp_doorsrv_mutex);
          return (0);
  }
  
  void
--- 96,113 ----
  
          (void) close(fd);
          (void) fdetach(NDMP_DOOR_SVC);
  
          if (fattach(ndmp_door_fildes, NDMP_DOOR_SVC) < 0) {
!                 syslog(LOG_ERR, "ndmp_door_init: fattach failed %m");
                  (void) door_revoke(ndmp_door_fildes);
                  ndmp_door_fildes = -1;
                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
                  return (-1);
          }
  
!         syslog(LOG_DEBUG, "ndmp_door_init: Door server successfully started");
          (void) mutex_unlock(&ndmp_doorsrv_mutex);
          return (0);
  }
  
  void
*** 135,145 ****
                  (void) close(door);
                  return (0);
          }
  
          if (info.di_target > 0) {
!                 NDMP_LOG(LOG_ERR,
                      "Service already running: pid %ld", info.di_target);
                  (void) close(door);
                  return (1);
          }
  
--- 137,147 ----
                  (void) close(door);
                  return (0);
          }
  
          if (info.di_target > 0) {
!                 syslog(LOG_ERR,
                      "Service already running: pid %ld", info.di_target);
                  (void) close(door);
                  return (1);
          }
  
*** 158,179 ****
          char *buf;
          int buflen;
          unsigned int used;
          ndmp_door_ctx_t *dec_ctx;
          ndmp_door_ctx_t *enc_ctx;
!         unsigned int dec_status;
!         unsigned int enc_status;
  
          dec_ctx = ndmp_door_decode_start(ptr, size);
          if (dec_ctx == 0)
                  return;
  
          req_type = ndmp_door_get_uint32(dec_ctx);
          buflen = NDMP_DOOR_SIZE;
  
          if ((buf = alloca(buflen)) == NULL) {
!                 NDMP_LOG(LOG_DEBUG, "Out of memory.");
                  (void) ndmp_door_decode_finish(dec_ctx);
                  return;
          }
  
          enc_ctx = ndmp_door_encode_start(buf, buflen);
--- 160,181 ----
          char *buf;
          int buflen;
          unsigned int used;
          ndmp_door_ctx_t *dec_ctx;
          ndmp_door_ctx_t *enc_ctx;
!         unsigned int dec_status = EINVAL;
!         unsigned int enc_status = EINVAL;
  
          dec_ctx = ndmp_door_decode_start(ptr, size);
          if (dec_ctx == 0)
                  return;
  
          req_type = ndmp_door_get_uint32(dec_ctx);
          buflen = NDMP_DOOR_SIZE;
  
          if ((buf = alloca(buflen)) == NULL) {
!                 syslog(LOG_ERR, "Out of memory.");
                  (void) ndmp_door_decode_finish(dec_ctx);
                  return;
          }
  
          enc_ctx = ndmp_door_encode_start(buf, buflen);
*** 181,191 ****
                  (void) ndmp_door_decode_finish(dec_ctx);
                  return;
          }
  
          if (req_type != NDMP_GET_STAT)
!                 NDMP_LOG(LOG_DEBUG, "ndmp_door_server: req_type=%d", req_type);
  
          switch (req_type) {
          case NDMP_GET_DOOR_STATUS: {
                  ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
                  break;
--- 183,193 ----
                  (void) ndmp_door_decode_finish(dec_ctx);
                  return;
          }
  
          if (req_type != NDMP_GET_STAT)
!                 syslog(LOG_DEBUG, "ndmp_door_server: req_type=%d", req_type);
  
          switch (req_type) {
          case NDMP_GET_DOOR_STATUS: {
                  ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
                  break;
*** 227,237 ****
                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_rtape);
                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_wtape);
                  break;
  
          default:
!                 NDMP_LOG(LOG_DEBUG,
                      "ndmp_door_server: Invalid request type 0x%x", req_type);
                  goto decode_error;
          }
  
          if ((dec_status = ndmp_door_decode_finish(dec_ctx)) != 0)
--- 229,239 ----
                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_rtape);
                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_wtape);
                  break;
  
          default:
!                 syslog(LOG_ERR,
                      "ndmp_door_server: Invalid request type 0x%x", req_type);
                  goto decode_error;
          }
  
          if ((dec_status = ndmp_door_decode_finish(dec_ctx)) != 0)