Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Apr 2009 20:17:32 +0000 (UTC)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r191147 - in head/sys: bsm security/audit
Message-ID:  <200904162017.n3GKHWVh090621@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rwatson
Date: Thu Apr 16 20:17:32 2009
New Revision: 191147
URL: http://svn.freebsd.org/changeset/base/191147

Log:
  Merge new kernel files from OpenBSM 1.1: audit_fcntl.h and
  audit_bsm_fcntl.c contain utility routines to map local fcntl
  commands into BSM constants.  Adaptation to the FreeBSD kernel
  environment will follow in a future commit.
  
  Sponsored by:	Apple, Inc.
  Obtained from:	TrustedBSD Project
  MFC after:	2 weeks

Added:
  head/sys/bsm/audit_fcntl.h   (contents, props changed)
  head/sys/security/audit/audit_bsm_fcntl.c   (contents, props changed)

Added: head/sys/bsm/audit_fcntl.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/bsm/audit_fcntl.h	Thu Apr 16 20:17:32 2009	(r191147)
@@ -0,0 +1,141 @@
+/*-
+ * Copyright (c) 2009 Apple Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 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. 
+ *
+ * P4: //depot/projects/trustedbsd/openbsm/sys/bsm/audit_fcntl.h#2
+ * $FreeBSD$
+ */
+
+#ifndef	_BSM_AUDIT_FCNTL_H_
+#define	_BSM_AUDIT_FCNTL_H_
+
+/*
+ * Shared and Solaris-specific: (0-99).
+ */
+#define	BSM_F_DUPFD		0
+#define	BSM_F_GETFD		1
+#define	BSM_F_SETFD		2
+#define	BSM_F_GETFL		3
+#define	BSM_F_SETFL		4
+#define	BSM_F_O_GETLK		5	/* Solaris-specific. */
+#define	BSM_F_SETLK		6
+#define	BSM_F_SETLKW		7
+#define	BSM_F_CHKFL		8	/* Solaris-specific. */
+#define	BSM_F_DUP2FD		9	/* FreeBSD/Solaris-specific. */
+#define	BSM_F_ALLOCSP		10	/* Solaris-specific. */
+#define	BSM_F_FREESP		11	/* Solaris-specific. */
+
+#define	BSM_F_ISSTREAM		13	/* Solaris-specific. */
+#define	BSM_F_GETLK		14	
+#define	BSM_F_PRIV		15	/* Solaris-specific. */
+#define	BSM_F_NPRIV		16	/* Solaris-specific. */
+#define	BSM_F_QUOTACTL		17	/* Solaris-specific. */
+#define	BSM_F_BLOCKS		18	/* Solaris-specific. */
+#define	BSM_F_BLKSIZE		19	/* Solaris-specific. */
+
+#define	BSM_F_GETOWN		23
+#define	BSM_F_SETOWN		24
+#define	BSM_F_REVOKE		25	/* Solaris-specific. */
+#define	BSM_F_HASREMOTELOCKS	26	/* Solaris-specific. */
+#define	BSM_F_FREESP64		27	/* Solaris-specific. */
+#define	BSM_F_ALLOCSP64		28	/* Solaris-specific. */
+
+#define	BSM_F_GETLK64		33	/* Solaris-specific. */
+#define	BSM_F_SETLK64		34	/* Solaris-specific. */
+#define	BSM_F_SETLKW64		35	/* Solaris-specific. */
+
+#define	BSM_F_SHARE		40	/* Solaris-specific. */
+#define	BSM_F_UNSHARE		41 	/* Solaris-specific. */
+#define	BSM_F_SETLK_NBMAND	42	/* Solaris-specific. */
+#define	BSM_F_SHARE_NBMAND	43	/* Solaris-specific. */
+#define	BSM_F_SETLK64_NBMAND	44 	/* Solaris-specific. */
+#define	BSM_F_GETXFL		45	/* Solaris-specific. */
+#define	BSM_F_BADFD		46	/* Solaris-specific. */
+
+/*
+ * FreeBSD-specific (100-199).
+ */
+#define	BSM_F_OGETLK		107	/* FreeBSD-specific. */
+#define	BSM_F_OSETLK		108	/* FreeBSD-specific. */
+#define	BSM_F_OSETLKW		109	/* FreeBSD-specific. */
+
+#define	BSM_F_SETLK_REMOTE	114	/* FreeBSD-specific. */
+
+/*
+ * Linux-specific (200-299).
+ */
+#define	BSM_F_SETSIG		210	/* Linux-specific. */
+#define	BSM_F_GETSIG		211	/* Linux-specific. */
+
+/*
+ * Darwin-specific (300-399).
+ */
+#define	BSM_F_CHKCLEAN 		341	/* Darwin-specific. */
+#define	BSM_F_PREALLOCATE	342	/* Darwin-specific. */
+#define	BSM_F_SETSIZE		343	/* Darwin-specific. */
+#define	BSM_F_RDADVISE		344	/* Darwin-specific. */
+#define	BSM_F_RDAHEAD		345	/* Darwin-specific. */
+#define	BSM_F_READBOOTSTRAP	346	/* Darwin-specific. */
+#define	BSM_F_WRITEBOOTSTRAP	347	/* Darwin-specific. */
+#define	BSM_F_NOCACHE		348	/* Darwin-specific. */
+#define	BSM_F_LOG2PHYS		349	/* Darwin-specific. */
+#define	BSM_F_GETPATH		350	/* Darwin-specific. */
+#define	BSM_F_FULLFSYNC		351	/* Darwin-specific. */
+#define	BSM_F_PATHPKG_CHECK	352	/* Darwin-specific. */
+#define	BSM_F_FREEZE_FS		353	/* Darwin-specific. */
+#define	BSM_F_THAW_FS		354	/* Darwin-specific. */
+#define	BSM_F_GLOBAL_NOCACHE	355	/* Darwin-specific. */
+#define	BSM_F_OPENFROM		356	/* Darwin-specific. */
+#define	BSM_F_UNLINKFROM	357	/* Darwin-specific. */
+#define	BSM_F_CHECK_OPENEVT	358	/* Darwin-specific. */
+#define	BSM_F_ADDSIGS		359	/* Darwin-specific. */
+#define	BSM_F_MARKDEPENDENCY	360	/* Darwin-specific. */
+
+/*
+ * Darwin file system specific (400-499).
+ */
+#define	BSM_F_FS_SPECIFIC_0	400	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_1	401	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_2	402	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_3	403	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_4	404	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_5	405	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_6	406	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_7	407	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_8	408	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_9	409	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_10	410	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_11	411	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_12	412	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_13	413	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_14	414	/* Darwin-fs-specific. */
+#define	BSM_F_FS_SPECIFIC_15	415	/* Darwin-fs-specific. */
+
+
+#define	BSM_F_UNKNOWN		0xFFFF	
+
+#endif /* !_BSM_AUDIT_FCNTL_H_ */

Added: head/sys/security/audit/audit_bsm_fcntl.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/security/audit/audit_bsm_fcntl.c	Thu Apr 16 20:17:32 2009	(r191147)
@@ -0,0 +1,290 @@
+/*-
+ * Copyright (c) 2008-2009 Apple Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 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.
+ *
+ * P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_fcntl.c#2
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/fcntl.h>
+
+#include <config/config.h>
+
+#include <bsm/audit_fcntl.h>
+#include <bsm/libbsm.h>
+
+struct bsm_fcntl_cmd {
+	u_short	bfc_bsm_fcntl_cmd;
+	int	bfc_local_fcntl_cmd;
+};
+typedef struct bsm_fcntl_cmd	bsm_fcntl_cmd_t;
+
+static const bsm_fcntl_cmd_t bsm_fcntl_cmdtab[] = {
+	{ BSM_F_DUPFD, 		F_DUPFD },
+	{ BSM_F_GETFD,		F_GETFD },
+	{ BSM_F_SETFD,		F_SETFD	},
+	{ BSM_F_GETFL,		F_GETFL },
+	{ BSM_F_SETFL,		F_SETFL },
+#ifdef	F_O_GETLK
+	{ BSM_F_O_GETLK,	F_O_GETLK },
+#endif
+	{ BSM_F_SETLK,		F_SETLK },
+	{ BSM_F_SETLKW,		F_SETLK },
+#ifdef	F_CHFL
+	{ BSM_F_CHKFL,		F_CHKFL },
+#endif
+#ifdef 	F_DUP2FD
+	{ BSM_F_DUP2FD,		F_DUP2FD },
+#endif
+#ifdef	F_ALLOCSP
+	{ BSM_F_ALLOCSP,	F_ALLOCSP },
+#endif
+#ifdef	F_FREESP
+	{ BSM_F_FREESP,		F_FREESP },
+#endif
+#ifdef	F_ISSTREAM
+	{ BSM_F_ISSTREAM,	F_ISSTREAM},
+#endif
+	{ BSM_F_GETLK,		F_GETLK },
+#ifdef 	F_PRIV
+	{ BSM_F_PRIV,		F_PRIV },
+#endif
+#ifdef	F_NPRIV
+	{ BSM_F_NPRIV,		F_NPRIV },
+#endif
+#ifdef 	F_QUOTACTL
+	{ BSM_F_QUOTACTL,	F_QUOTACTL },
+#endif
+#ifdef	F_BLOCKS
+	{ BSM_F_BLOCKS,		F_BLOCKS },
+#endif
+#ifdef	F_BLKSIZE
+	{ BSM_F_BLKSIZE,	F_BLKSIZE },
+#endif
+	{ BSM_F_GETOWN,		F_GETOWN },
+	{ BSM_F_SETOWN,		F_SETOWN },
+#ifdef	F_REVOKE
+	{ BSM_F_REVOKE,		F_REVOKE },
+#endif
+#ifdef 	F_HASREMOTEBLOCKS
+	{ BSM_F_HASREMOTEBLOCKS,
+				F_HASREMOTEBLOCKS },
+#endif
+#ifdef 	F_FREESP
+	{ BSM_F_FREESP,		F_FREESP },
+#endif
+#ifdef 	F_ALLOCSP
+	{ BSM_F_ALLOCSP,	F_ALLOCSP },
+#endif
+#ifdef	F_FREESP64
+	{ BSM_F_FREESP64,	F_FREESP64 },
+#endif
+#ifdef 	F_ALLOCSP64
+	{ BSM_F_ALLOCSP64,	F_ALLOCSP64 },
+#endif
+#ifdef	F_GETLK64
+	{ BSM_F_GETLK64, 	F_GETLK64 },
+#endif
+#ifdef	F_SETLK64
+	{ BSM_F_SETLK64, 	F_SETLK64 },
+#endif
+#ifdef	F_SETLKW64
+	{ BSM_F_SETLKW64, 	F_SETLKW64 },
+#endif
+#ifdef	F_SHARE
+	{ BSM_F_SHARE,		F_SHARE },
+#endif
+#ifdef	F_UNSHARE
+	{ BSM_F_UNSHARE,	F_UNSHARE },
+#endif
+#ifdef	F_SETLK_NBMAND
+	{ BSM_F_SETLK_NBMAND,	F_SETLK_NBMAND },
+#endif
+#ifdef	F_SHARE_NBMAND
+	{ BSM_F_SHARE_NBMAND,	F_SHARE_NBMAND },
+#endif
+#ifdef	F_SETLK64_NBMAND
+	{ BSM_F_SETLK64_NBMAND,	F_SETLK64_NBMAND },
+#endif
+#ifdef	F_GETXFL
+	{ BSM_F_GETXFL,		F_GETXFL },
+#endif
+#ifdef	F_BADFD
+	{ BSM_F_BADFD,		F_BADFD },
+#endif
+#ifdef	F_OGETLK
+	{ BSM_F_OGETLK,		F_OGETLK },
+#endif
+#ifdef	F_OSETLK
+	{ BSM_F_OSETLK,		F_OSETLK },
+#endif
+#ifdef	F_OSETLKW
+	{ BSM_F_OSETLKW,	F_OSETLKW },
+#endif
+#ifdef	F_SETLK_REMOTE
+	{ BSM_F_SETLK_REMOTE,	F_SETLK_REMOTE },
+#endif
+
+#ifdef	F_SETSIG
+	{ BSM_F_SETSIG,		F_SETSIG },
+#endif
+#ifdef	F_GETSIG
+	{ BSM_F_GETSIG,		F_GETSIG },
+#endif
+
+#ifdef	F_CHKCLEAN
+	{ BSM_F_CHKCLEAN,	F_CHKCLEAN },
+#endif
+#ifdef	F_PREALLOCATE
+	{ BSM_F_PREALLOCATE,	F_PREALLOCATE },
+#endif
+#ifdef	F_SETSIZE
+	{ BSM_F_SETSIZE,	F_SETSIZE },
+#endif
+#ifdef	F_RDADVISE
+	{ BSM_F_RDADVISE,	F_RDADVISE },
+#endif
+#ifdef	F_RDAHEAD
+	{ BSM_F_RDAHEAD,	F_RDAHEAD },
+#endif
+#ifdef	F_READBOOTSTRAP
+	{ BSM_F_READBOOTSTRAP,	F_READBOOTSTRAP },
+#endif
+#ifdef	F_WRITEBOOTSTRAP
+	{ BSM_F_WRITEBOOTSTRAP,	F_WRITEBOOTSTRAP },
+#endif
+#ifdef	F_NOCACHE
+	{ BSM_F_NOCACHE,	F_NOCACHE },
+#endif
+#ifdef	F_LOG2PHYS
+	{ BSM_F_LOG2PHYS,	F_LOG2PHYS },
+#endif
+#ifdef	F_GETPATH
+	{ BSM_F_GETPATH,	F_GETPATH },
+#endif
+#ifdef	F_FULLFSYNC
+	{ BSM_F_FULLFSYNC,	F_FULLFSYNC },
+#endif
+#ifdef	F_PATHPKG_CHECK
+	{ BSM_F_PATHPKG_CHECK,	F_PATHPKG_CHECK },
+#endif
+#ifdef	F_FREEZE_FS
+	{ BSM_F_FREEZE_FS,	F_FREEZE_FS },
+#endif
+#ifdef	F_THAW_FS
+	{ BSM_F_THAW_FS,	F_THAW_FS },
+#endif
+#ifdef	F_GLOBAL_NOCACHE
+	{ BSM_F_GLOBAL_NOCACHE,	F_GLOBAL_NOCACHE },
+#endif
+#ifdef	F_OPENFROM
+	{ BSM_F_OPENFROM,	F_OPENFROM },
+#endif
+#ifdef	F_UNLINKFROM
+	{ BSM_F_UNLINKFROM,	F_UNLINKFROM },
+#endif
+#ifdef	F_CHECK_OPENEVT
+	{ BSM_F_CHECK_OPENEVT,	F_CHECK_OPENEVT },
+#endif
+#ifdef	F_ADDSIGS
+	{ BSM_F_ADDSIGS,	F_ADDSIGS },
+#endif
+#ifdef	F_MARKDEPENDENCY
+	{ BSM_F_MARKDEPENDENCY,	F_MARKDEPENDENCY },
+#endif
+
+#ifdef	FCNTL_FS_SPECIFIC_BASE
+	{ BSM_F_FS_SPECIFIC_0,	FCNTL_FS_SPECIFIC_BASE},
+	{ BSM_F_FS_SPECIFIC_1,	FCNTL_FS_SPECIFIC_BASE + 1},
+	{ BSM_F_FS_SPECIFIC_2,	FCNTL_FS_SPECIFIC_BASE + 2},
+	{ BSM_F_FS_SPECIFIC_3,	FCNTL_FS_SPECIFIC_BASE + 3},
+	{ BSM_F_FS_SPECIFIC_4,	FCNTL_FS_SPECIFIC_BASE + 4},
+	{ BSM_F_FS_SPECIFIC_5,	FCNTL_FS_SPECIFIC_BASE + 5},
+	{ BSM_F_FS_SPECIFIC_6,	FCNTL_FS_SPECIFIC_BASE + 6},
+	{ BSM_F_FS_SPECIFIC_7,	FCNTL_FS_SPECIFIC_BASE + 7},
+	{ BSM_F_FS_SPECIFIC_8,	FCNTL_FS_SPECIFIC_BASE + 8},
+	{ BSM_F_FS_SPECIFIC_9,	FCNTL_FS_SPECIFIC_BASE + 9},
+	{ BSM_F_FS_SPECIFIC_10,	FCNTL_FS_SPECIFIC_BASE + 10},
+	{ BSM_F_FS_SPECIFIC_11,	FCNTL_FS_SPECIFIC_BASE + 11},
+	{ BSM_F_FS_SPECIFIC_12,	FCNTL_FS_SPECIFIC_BASE + 12},
+	{ BSM_F_FS_SPECIFIC_13,	FCNTL_FS_SPECIFIC_BASE + 13},
+	{ BSM_F_FS_SPECIFIC_14,	FCNTL_FS_SPECIFIC_BASE + 14},
+	{ BSM_F_FS_SPECIFIC_15,	FCNTL_FS_SPECIFIC_BASE + 15},
+#endif	/* FCNTL_FS_SPECIFIC_BASE */
+};
+static const int bsm_fcntl_cmd_count = sizeof(bsm_fcntl_cmdtab) /
+	    sizeof(bsm_fcntl_cmdtab[0]);
+
+static const bsm_fcntl_cmd_t *
+bsm_lookup_local_fcntl_cmd(int local_fcntl_cmd)
+{
+	int i;
+
+	for (i = 0; i < bsm_fcntl_cmd_count; i++) {
+		if (bsm_fcntl_cmdtab[i].bfc_local_fcntl_cmd ==
+		    local_fcntl_cmd)
+			return (&bsm_fcntl_cmdtab[i]);
+	}
+	return (NULL);
+}
+
+u_short
+au_fcntl_cmd_to_bsm(int local_fcntl_cmd)
+{
+	const bsm_fcntl_cmd_t *bfcp;
+
+	bfcp = bsm_lookup_local_fcntl_cmd(local_fcntl_cmd);
+	if (bfcp == NULL)
+		return (BSM_F_UNKNOWN);
+	return (bfcp->bfc_bsm_fcntl_cmd);
+}
+
+static const bsm_fcntl_cmd_t *
+bsm_lookup_bsm_fcntl_cmd(u_short bsm_fcntl_cmd)
+{
+	int i;
+
+	for (i = 0; i < bsm_fcntl_cmd_count; i++) {
+		if (bsm_fcntl_cmdtab[i].bfc_bsm_fcntl_cmd ==
+		    bsm_fcntl_cmd)
+			return (&bsm_fcntl_cmdtab[i]);
+	}
+	return (NULL);
+}
+
+int
+au_bsm_to_fcntl_cmd(u_short bsm_fcntl_cmd, int *local_fcntl_cmdp)
+{
+	const bsm_fcntl_cmd_t *bfcp;
+
+	bfcp = bsm_lookup_bsm_fcntl_cmd(bsm_fcntl_cmd);
+	if (bfcp == NULL || bfcp->bfc_local_fcntl_cmd)
+		return (-1);
+	*local_fcntl_cmdp = bfcp->bfc_local_fcntl_cmd;
+	return (0);
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904162017.n3GKHWVh090621>