提交 632a8697 编写于 作者: J John Ferlan

conf: Use VIR_STEAL_PTR in domain_conf

In preparation for some autofree mods.
Signed-off-by: NJohn Ferlan <jferlan@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 740aeb34
...@@ -1596,8 +1596,7 @@ virDomainVcpuDefNew(virDomainXMLOptionPtr xmlopt) ...@@ -1596,8 +1596,7 @@ virDomainVcpuDefNew(virDomainXMLOptionPtr xmlopt)
if (VIR_ALLOC(ret) < 0) if (VIR_ALLOC(ret) < 0)
goto cleanup; goto cleanup;
ret->privateData = priv; VIR_STEAL_PTR(ret->privateData, priv);
priv = NULL;
cleanup: cleanup:
virObjectUnref(priv); virObjectUnref(priv);
...@@ -6242,10 +6241,8 @@ virDomainDefValidateAliases(const virDomainDef *def, ...@@ -6242,10 +6241,8 @@ virDomainDefValidateAliases(const virDomainDef *def,
&data) < 0) &data) < 0)
goto cleanup; goto cleanup;
if (aliases) { if (aliases)
*aliases = data.aliases; VIR_STEAL_PTR(*aliases, data.aliases);
data.aliases = NULL;
}
ret = 0; ret = 0;
cleanup: cleanup:
...@@ -7798,8 +7795,7 @@ virDomainHostdevSubsysSCSIVHostDefParseXML(xmlNodePtr sourcenode, ...@@ -7798,8 +7795,7 @@ virDomainHostdevSubsysSCSIVHostDefParseXML(xmlNodePtr sourcenode,
virReportError(VIR_ERR_XML_ERROR, "%s", _("malformed 'wwpn' value")); virReportError(VIR_ERR_XML_ERROR, "%s", _("malformed 'wwpn' value"));
goto cleanup; goto cleanup;
} }
hostsrc->wwpn = wwpn; VIR_STEAL_PTR(hostsrc->wwpn, wwpn);
wwpn = NULL;
break; break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_NONE: case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_NONE:
case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_LAST: case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_LAST:
...@@ -8526,8 +8522,7 @@ virSecurityLabelDefParseXML(xmlXPathContextPtr ctxt, ...@@ -8526,8 +8522,7 @@ virSecurityLabelDefParseXML(xmlXPathContextPtr ctxt,
goto error; goto error;
} }
seclabel->label = p; VIR_STEAL_PTR(seclabel->label, p);
p = NULL;
} }
/* Only parse imagelabel, if requested live XML with relabeling */ /* Only parse imagelabel, if requested live XML with relabeling */
...@@ -8541,16 +8536,14 @@ virSecurityLabelDefParseXML(xmlXPathContextPtr ctxt, ...@@ -8541,16 +8536,14 @@ virSecurityLabelDefParseXML(xmlXPathContextPtr ctxt,
"%s", _("security imagelabel is missing")); "%s", _("security imagelabel is missing"));
goto error; goto error;
} }
seclabel->imagelabel = p; VIR_STEAL_PTR(seclabel->imagelabel, p);
p = NULL;
} }
/* Only parse baselabel for dynamic label type */ /* Only parse baselabel for dynamic label type */
if (seclabel->type == VIR_DOMAIN_SECLABEL_DYNAMIC) { if (seclabel->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
p = virXPathStringLimit("string(./baselabel[1])", p = virXPathStringLimit("string(./baselabel[1])",
VIR_SECURITY_LABEL_BUFLEN-1, ctxt); VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
seclabel->baselabel = p; VIR_STEAL_PTR(seclabel->baselabel, p);
p = NULL;
} }
return seclabel; return seclabel;
...@@ -8844,10 +8837,9 @@ virDomainLeaseDefParseXML(xmlNodePtr node) ...@@ -8844,10 +8837,9 @@ virDomainLeaseDefParseXML(xmlNodePtr node)
goto error; goto error;
} }
def->key = key; VIR_STEAL_PTR(def->key, key);
def->lockspace = lockspace; VIR_STEAL_PTR(def->lockspace, lockspace);
def->path = path; VIR_STEAL_PTR(def->path, path);
path = key = lockspace = NULL;
cleanup: cleanup:
VIR_FREE(lockspace); VIR_FREE(lockspace);
...@@ -8901,8 +8893,7 @@ virDomainDiskSourcePoolDefParse(xmlNodePtr node, ...@@ -8901,8 +8893,7 @@ virDomainDiskSourcePoolDefParse(xmlNodePtr node,
goto cleanup; goto cleanup;
} }
*srcpool = source; VIR_STEAL_PTR(*srcpool, source);
source = NULL;
ret = 0; ret = 0;
cleanup: cleanup:
...@@ -10144,22 +10135,16 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -10144,22 +10135,16 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
def->startupPolicy = val; def->startupPolicy = val;
} }
def->dst = target; VIR_STEAL_PTR(def->dst, target);
target = NULL;
if (authdef) if (authdef)
VIR_STEAL_PTR(def->src->auth, authdef); VIR_STEAL_PTR(def->src->auth, authdef);
if (encryption) if (encryption)
VIR_STEAL_PTR(def->src->encryption, encryption); VIR_STEAL_PTR(def->src->encryption, encryption);
def->domain_name = domain_name; VIR_STEAL_PTR(def->domain_name, domain_name);
domain_name = NULL; VIR_STEAL_PTR(def->serial, serial);
def->serial = serial; VIR_STEAL_PTR(def->wwn, wwn);
serial = NULL; VIR_STEAL_PTR(def->vendor, vendor);
def->wwn = wwn; VIR_STEAL_PTR(def->product, product);
wwn = NULL;
def->vendor = vendor;
vendor = NULL;
def->product = product;
product = NULL;
if (!(flags & VIR_DOMAIN_DEF_PARSE_DISK_SOURCE)) { if (!(flags & VIR_DOMAIN_DEF_PARSE_DISK_SOURCE)) {
if (virDomainDiskBackingStoreParse(ctxt, def->src, flags, xmlopt) < 0) if (virDomainDiskBackingStoreParse(ctxt, def->src, flags, xmlopt) < 0)
...@@ -11004,10 +10989,8 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11004,10 +10989,8 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt,
goto error; goto error;
} }
def->src->path = source; VIR_STEAL_PTR(def->src->path, source);
source = NULL; VIR_STEAL_PTR(def->dst, target);
def->dst = target;
target = NULL;
if (virDomainDeviceInfoParseXML(xmlopt, node, &def->info, flags) < 0) if (virDomainDeviceInfoParseXML(xmlopt, node, &def->info, flags) < 0)
goto error; goto error;
...@@ -11196,8 +11179,7 @@ virDomainActualNetDefParseXML(xmlNodePtr node, ...@@ -11196,8 +11179,7 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
if (vlanNode && virNetDevVlanParse(vlanNode, ctxt, &actual->vlan) < 0) if (vlanNode && virNetDevVlanParse(vlanNode, ctxt, &actual->vlan) < 0)
goto error; goto error;
*def = actual; VIR_STEAL_PTR(*def, actual);
actual = NULL;
ret = 0; ret = 0;
error: error:
VIR_FREE(type); VIR_FREE(type);
...@@ -11604,8 +11586,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11604,8 +11586,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
_("Model name contains invalid characters")); _("Model name contains invalid characters"));
goto error; goto error;
} }
def->model = model; VIR_STEAL_PTR(def->model, model);
model = NULL;
} }
switch (def->type) { switch (def->type) {
...@@ -11616,12 +11597,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11616,12 +11597,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
"specified with <interface type='network'/>")); "specified with <interface type='network'/>"));
goto error; goto error;
} }
def->data.network.name = network; VIR_STEAL_PTR(def->data.network.name, network);
network = NULL; VIR_STEAL_PTR(def->data.network.portgroup, portgroup);
def->data.network.portgroup = portgroup; VIR_STEAL_PTR(def->data.network.actual, actual);
portgroup = NULL;
def->data.network.actual = actual;
actual = NULL;
break; break;
case VIR_DOMAIN_NET_TYPE_VHOSTUSER: case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
...@@ -11667,8 +11645,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11667,8 +11645,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
goto error; goto error;
def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX; def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX;
def->data.vhostuser->data.nix.path = vhostuser_path; VIR_STEAL_PTR(def->data.vhostuser->data.nix.path, vhostuser_path);
vhostuser_path = NULL;
if (STREQ(vhostuser_mode, "server")) { if (STREQ(vhostuser_mode, "server")) {
def->data.vhostuser->data.nix.listen = true; def->data.vhostuser->data.nix.listen = true;
...@@ -11697,8 +11674,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11697,8 +11674,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
"specified with <interface type='bridge'/>")); "specified with <interface type='bridge'/>"));
goto error; goto error;
} }
def->data.bridge.brname = bridge; VIR_STEAL_PTR(def->data.bridge.brname, bridge);
bridge = NULL;
break; break;
case VIR_DOMAIN_NET_TYPE_CLIENT: case VIR_DOMAIN_NET_TYPE_CLIENT:
...@@ -11728,8 +11704,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11728,8 +11704,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
goto error; goto error;
} }
} else { } else {
def->data.socket.address = address; VIR_STEAL_PTR(def->data.socket.address, address);
address = NULL;
} }
if (def->type != VIR_DOMAIN_NET_TYPE_UDP) if (def->type != VIR_DOMAIN_NET_TYPE_UDP)
...@@ -11754,8 +11729,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11754,8 +11729,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
"specified with socket interface")); "specified with socket interface"));
goto error; goto error;
} else { } else {
def->data.socket.localaddr = localaddr; VIR_STEAL_PTR(def->data.socket.localaddr, localaddr);
localaddr = NULL;
} }
break; break;
...@@ -11766,8 +11740,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11766,8 +11740,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
"with <interface type='internal'/>")); "with <interface type='internal'/>"));
goto error; goto error;
} }
def->data.internal.name = internal; VIR_STEAL_PTR(def->data.internal.name, internal);
internal = NULL;
break; break;
case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_DIRECT:
...@@ -11789,8 +11762,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11789,8 +11762,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
def->data.direct.mode = VIR_NETDEV_MACVLAN_MODE_VEPA; def->data.direct.mode = VIR_NETDEV_MACVLAN_MODE_VEPA;
} }
def->data.direct.linkdev = dev; VIR_STEAL_PTR(def->data.direct.linkdev, dev);
dev = NULL;
if (ifname && if (ifname &&
flags & VIR_DOMAIN_DEF_PARSE_INACTIVE && flags & VIR_DOMAIN_DEF_PARSE_INACTIVE &&
...@@ -11832,26 +11804,16 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11832,26 +11804,16 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
ctxt, &def->guestIP) < 0) ctxt, &def->guestIP) < 0)
goto error; goto error;
if (script != NULL) { if (script != NULL)
def->script = script; VIR_STEAL_PTR(def->script, script);
script = NULL; if (domain_name != NULL)
} VIR_STEAL_PTR(def->domain_name, domain_name);
if (domain_name != NULL) { if (ifname != NULL)
def->domain_name = domain_name; VIR_STEAL_PTR(def->ifname, ifname);
domain_name = NULL; if (ifname_guest != NULL)
} VIR_STEAL_PTR(def->ifname_guest, ifname_guest);
if (ifname != NULL) { if (ifname_guest_actual != NULL)
def->ifname = ifname; VIR_STEAL_PTR(def->ifname_guest_actual, ifname_guest_actual);
ifname = NULL;
}
if (ifname_guest != NULL) {
def->ifname_guest = ifname_guest;
ifname_guest = NULL;
}
if (ifname_guest_actual != NULL) {
def->ifname_guest_actual = ifname_guest_actual;
ifname_guest_actual = NULL;
}
if (def->type != VIR_DOMAIN_NET_TYPE_HOSTDEV && if (def->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
virDomainNetIsVirtioModel(def)) { virDomainNetIsVirtioModel(def)) {
...@@ -12051,8 +12013,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -12051,8 +12013,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
def->driver.virtio.guest.ufo = val; def->driver.virtio.guest.ufo = val;
} }
} }
def->backend.vhost = vhost_path; VIR_STEAL_PTR(def->backend.vhost, vhost_path);
vhost_path = NULL;
} }
def->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT; def->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT;
...@@ -12070,10 +12031,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -12070,10 +12031,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
case VIR_DOMAIN_NET_TYPE_ETHERNET: case VIR_DOMAIN_NET_TYPE_ETHERNET:
case VIR_DOMAIN_NET_TYPE_NETWORK: case VIR_DOMAIN_NET_TYPE_NETWORK:
case VIR_DOMAIN_NET_TYPE_BRIDGE: case VIR_DOMAIN_NET_TYPE_BRIDGE:
def->filter = filter; VIR_STEAL_PTR(def->filter, filter);
filter = NULL; VIR_STEAL_PTR(def->filterparams, filterparams);
def->filterparams = filterparams;
filterparams = NULL;
break; break;
case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_USER:
case VIR_DOMAIN_NET_TYPE_VHOSTUSER: case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
...@@ -13127,9 +13086,8 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -13127,9 +13086,8 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
path = virXPathString("string(./backend/device/@path)", ctxt); path = virXPathString("string(./backend/device/@path)", ctxt);
if (!path && VIR_STRDUP(path, VIR_DOMAIN_TPM_DEFAULT_DEVICE) < 0) if (!path && VIR_STRDUP(path, VIR_DOMAIN_TPM_DEFAULT_DEVICE) < 0)
goto error; goto error;
def->data.passthrough.source.data.file.path = path; VIR_STEAL_PTR(def->data.passthrough.source.data.file.path, path);
def->data.passthrough.source.type = VIR_DOMAIN_CHR_TYPE_DEV; def->data.passthrough.source.type = VIR_DOMAIN_CHR_TYPE_DEV;
path = NULL;
break; break;
case VIR_DOMAIN_TPM_TYPE_EMULATOR: case VIR_DOMAIN_TPM_TYPE_EMULATOR:
break; break;
...@@ -13694,8 +13652,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, ...@@ -13694,8 +13652,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
(def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS || (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS ||
(def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK && (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK &&
!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)))) { !(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)))) {
def->address = address; VIR_STEAL_PTR(def->address, address);
address = NULL;
} }
if (network && network[0]) { if (network && network[0]) {
...@@ -13705,8 +13662,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, ...@@ -13705,8 +13662,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
"type 'network'")); "type 'network'"));
goto error; goto error;
} }
def->network = network; VIR_STEAL_PTR(def->network, network);
network = NULL;
} }
if (socketPath && socketPath[0]) { if (socketPath && socketPath[0]) {
...@@ -13716,8 +13672,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, ...@@ -13716,8 +13672,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
"type 'socket'")); "type 'socket'"));
goto error; goto error;
} }
def->socket = socketPath; VIR_STEAL_PTR(def->socket, socketPath);
socketPath = NULL;
} }
if (fromConfig && if (fromConfig &&
...@@ -13805,8 +13760,7 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def, ...@@ -13805,8 +13760,7 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
if (socketPath) { if (socketPath) {
newListen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET; newListen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET;
newListen.socket = socketPath; VIR_STEAL_PTR(newListen.socket, socketPath);
socketPath = NULL;
} else { } else {
newListen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS; newListen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS;
newListen.address = virXMLPropString(node, "listen"); newListen.address = virXMLPropString(node, "listen");
...@@ -14344,7 +14298,7 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def, ...@@ -14344,7 +14298,7 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def,
VIR_FREE(enable); VIR_FREE(enable);
def->data.spice.gl = enableVal; def->data.spice.gl = enableVal;
def->data.spice.rendernode = rendernode; VIR_STEAL_PTR(def->data.spice.rendernode, rendernode);
} else if (virXMLNodeNameEqual(cur, "mouse")) { } else if (virXMLNodeNameEqual(cur, "mouse")) {
char *mode = virXMLPropString(cur, "mode"); char *mode = virXMLPropString(cur, "mode");
...@@ -14993,8 +14947,7 @@ virSysinfoBIOSParseXML(xmlNodePtr node, ...@@ -14993,8 +14947,7 @@ virSysinfoBIOSParseXML(xmlNodePtr node,
def = NULL; def = NULL;
} }
*bios = def; VIR_STEAL_PTR(*bios, def);
def = NULL;
ret = 0; ret = 0;
cleanup: cleanup:
virSysinfoBIOSDefFree(def); virSysinfoBIOSDefFree(def);
...@@ -15067,8 +15020,7 @@ virSysinfoSystemParseXML(xmlNodePtr node, ...@@ -15067,8 +15020,7 @@ virSysinfoSystemParseXML(xmlNodePtr node,
def = NULL; def = NULL;
} }
*sysdef = def; VIR_STEAL_PTR(*sysdef, def);
def = NULL;
ret = 0; ret = 0;
cleanup: cleanup:
virSysinfoSystemDefFree(def); virSysinfoSystemDefFree(def);
...@@ -15119,9 +15071,8 @@ virSysinfoBaseBoardParseXML(xmlXPathContextPtr ctxt, ...@@ -15119,9 +15071,8 @@ virSysinfoBaseBoardParseXML(xmlXPathContextPtr ctxt,
} }
} }
*baseBoard = boards; VIR_STEAL_PTR(*baseBoard, boards);
*nbaseBoard = nboards; *nbaseBoard = nboards;
boards = NULL;
ret = 0; ret = 0;
cleanup: cleanup:
VIR_FREE(boards); VIR_FREE(boards);
...@@ -15157,8 +15108,7 @@ virSysinfoOEMStringsParseXML(xmlXPathContextPtr ctxt, ...@@ -15157,8 +15108,7 @@ virSysinfoOEMStringsParseXML(xmlXPathContextPtr ctxt,
for (i = 0; i < nstrings; i++) for (i = 0; i < nstrings; i++)
def->values[i] = virXMLNodeContentString(strings[i]); def->values[i] = virXMLNodeContentString(strings[i]);
*oem = def; VIR_STEAL_PTR(*oem, def);
def = NULL;
ret = 0; ret = 0;
cleanup: cleanup:
VIR_FREE(strings); VIR_FREE(strings);
...@@ -15201,8 +15151,7 @@ virSysinfoChassisParseXML(xmlNodePtr node, ...@@ -15201,8 +15151,7 @@ virSysinfoChassisParseXML(xmlNodePtr node,
def = NULL; def = NULL;
} }
*chassisdef = def; VIR_STEAL_PTR(*chassisdef, def);
def = NULL;
ret = 0; ret = 0;
cleanup: cleanup:
virSysinfoChassisDefFree(def); virSysinfoChassisDefFree(def);
...@@ -18431,8 +18380,7 @@ virDomainIOThreadPinDefParseXML(xmlNodePtr node, ...@@ -18431,8 +18380,7 @@ virDomainIOThreadPinDefParseXML(xmlNodePtr node,
goto cleanup; goto cleanup;
} }
iothrid->cpumask = cpumask; VIR_STEAL_PTR(iothrid->cpumask, cpumask);
cpumask = NULL;
ret = 0; ret = 0;
cleanup: cleanup:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册